我是一位经验丰富的计算机图形程序员,主要使用Direct3D 9.0c,OpenGL和通用算法.目前,我正在评估Direct2D作为处理医学图像数据的专业应用程序的渲染技术.至于渲染,它是一个处于窗口模式的x64桌面应用程序(不是全屏).
在我最初的步骤中,我一直在努力完成一项任务,我认为这将是一个明智的选择:在屏幕上渲染单通道位图.
在Windows 8.1机器上运行时,我创建了一个ID2D1DeviceContext
带有Direct3D交换链缓冲区表面作为渲染目标.交换链是从HWND和缓冲区格式创建的DXGI_FORMAT_B8G8R8A8_UNORM
.注意:另请参阅最后的代码段.
然后,我创建了一个像素格式DXGI_FORMAT_R8_UNORM
和alpha模式的位图D2d1_ALPHA_MODE_IGNORE
.调用DrawBitmap(...)
设备上下文时,将使用调试消息"D2d DEBUG ERROR - 此操作与位图的像素格式不兼容"触发调试断点.
我知道这个输出很清楚.此外,更改像素格式时DXGI_FORMAT_R8G8B8A8_UNORM
使用DXGI_ALPHA_MODE_IGNORE
一切正常,我看到了位图呈现.但是,我简直不敢相信!从那时起,显卡就支持单通道纹理 - 每个3D图形应用程序都可以使用它们而无需考虑两次.这不用说.
我试图在谷歌找到任何东西,但没有成功.我能找到的唯一提示是带有(支持的像素格式)的MSDN Direct2D页面.文档建议 - 不提及它 - DXGI_FORMAT_R8_UNORM
确实不支持位图格式.我也发现帖子谈论alpha蒙版(使用DXGI_FORMAT_A8_UNORM
),但那不是我追求的.
我错过了什么,我不能说服Direct2D创建和绘制灰度位图?或者,Direct2D是否支持绘制R8或R16位图?
任何帮助都非常感谢,因为我不知道如何解决这个问题.如果我不能让这些琐碎的基础工作,我想我不得不停止深入研究Direct2D :-(.
以下是相关的代码片段.请注意,自从我将C++/CLI代码移植到普通C++后,它们可能无法编译.另外,我丢弃了所有错误检查和其他噪音:
设备,设备上下文和交换链创建(D3D和Direct2D):
// Direct2D factory creation
D2D1_FACTORY_OPTIONS options = {};
options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;
ID2D1Factory1* d2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, options, &d2dFactory);
// Direct3D device creation
const auto type = D3D_DRIVER_TYPE_HARDWARE;
const auto flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
ID3D11Device* d3dDevice;
D3D11CreateDevice(nullptr, …
Run Code Online (Sandbox Code Playgroud) direct2d ×1