调用CreateDxgiSurfaceRenderTarget创建D2D渲染目标持续失败问题求助
问题根因
- 像素格式不兼容:D2D硬件渲染目标不支持无符号整型格式,你当前使用的
DXGI_FORMAT_R32G32B32A32_UINT属于32位无符号四通道整型,不在D2D支持的渲染目标像素格式范围内,是创建失败的核心原因。 - D3D设备缺少互操作标志:你创建D3D10设备时未指定
D3D10_CREATE_DEVICE_BGRA_SUPPORT标志,该标志是D2D与D3D/DXGI互操作的强制要求,缺失会直接导致跨API创建渲染目标失败。
解决方案
按以下步骤修改代码即可解决:
- 第一步:修改D3D10设备创建参数,添加BGRA支持标志
HR(D3D10CreateDevice ( NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_BGRA_SUPPORT, // 新增互操作标志,原参数为NULL D3D10_SDK_VERSION, &D3dDevicePtr )); HR(D3dDevicePtr->QueryInterface(__uuidof(IDXGIDevice), (void**)&DXGIDevicePtr)); D3dDevicePtr->Release();
- 第二步:将DXGI表面格式替换为D2D支持的格式,按需选择以下常用格式即可:
- 高精度场景用
DXGI_FORMAT_R32G32B32A32_FLOAT(32位四通道浮点) - 常规渲染场景用
DXGI_FORMAT_B8G8R8A8_UNORM(8位四通道,性能最优) - 需RGBA顺序的场景用
DXGI_FORMAT_R8G8B8A8_UNORM
修改后的表面创建代码示例:
DXGI_SURFACE_DESC Desc = { 500, 500, DXGI_FORMAT_B8G8R8A8_UNORM , {1 , 0} }; HR(DXGIDevicePtr->CreateSurface(&Desc, 1, DXGI_USAGE_RENDER_TARGET_OUTPUT, NULL, &DXGISurfacePtr)); Surfaces.emplace_back(DXGISurfacePtr); - 高精度场景用
- 第三步:保持渲染目标属性的像素格式为
DXGI_FORMAT_UNKNOWN,D2D会自动匹配DXGI表面的格式,无需手动指定避免格式不匹配错误:FLOAT dpiX; FLOAT dpiY; D2dFacory->GetDesktopDpi(&dpiX, &dpiY); D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), dpiX, dpiY ); HR(D2dFacory->CreateDxgiSurfaceRenderTarget(DXGISurfacePtr, props, &SurfaceRTPtr)); RTs.emplace_back(SurfaceRTPtr);
内容的提问来源于stack exchange,提问作者Mohammed Ahmed
相关产品推荐
相关产品推荐

