Directx Direct3D9中支持的纹理格式

Directx Direct3D9中支持的纹理格式,directx,direct3d,Directx,Direct3d,我有一个Direct3D 11渲染器,我正在其中实现共享曲面,以在WPF应用程序(仅使用Direct3D 9)中显示内容 在D3D11端,我的后缓冲区使用DXGI_format_R8G8B8A8_UNORM格式,这很好用。根据DXGI_格式R8G8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,当我使用该格式在D3D9侧创建纹理时,它失败了。我使用的是Windows10,没有D3D9调试运行时,所以我得到的只是一个D3DERR_INVALIDCALL,结果没有其他信息 似

我有一个Direct3D 11渲染器,我正在其中实现共享曲面,以在WPF应用程序(仅使用Direct3D 9)中显示内容

在D3D11端,我的后缓冲区使用DXGI_format_R8G8B8A8_UNORM格式,这很好用。根据DXGI_格式R8G8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,当我使用该格式在D3D9侧创建纹理时,它失败了。我使用的是Windows10,没有D3D9调试运行时,所以我得到的只是一个D3DERR_INVALIDCALL,结果没有其他信息

似乎说D3D9中的后台缓冲区只支持ARGB格式,而ABGR格式不在任何支持部分下列出。这是文档中的错误还是完全不支持这种格式

如果我改为在D3D11侧使用DXGI_格式_B8G8R8A8_UNORM,在D3D9侧使用D3DFMT_A8R8G8B8,纹理创建成功

为了进一步混淆,这意味着DXGI_格式_R8G8B8A8_UNORM应该是更兼容的格式,但这正是我遇到的问题

我也在GitHub上确认了这种行为。开箱即用,它使用DXGI_格式_r8G8A8_UNORM,工作正常,但如果我将后缓冲区更改为DXGI_格式_B8G8R8A8_UNORM,它会崩溃


为什么我的视频卡支持的格式可以在一个API中工作,而不能在另一个API中工作?如何确定D3D9支持哪些格式?

坚持D3D11端的
DXGI\u格式B8G8R8A8\u UNORM
,以及D3D9中的
D3DFMT\u A8R8G8B8
。虽然
DXGI_FORMAT_R8G8B8A8_UNORM
在技术上更兼容,但如果您不需要D3D10支持,则应在所有D3D11设备上支持它

我如何确定D3D9支持哪些格式?

您可以使用“DirectX Caps查看器”(随Windows SDK提供-随最新版本的Visual Studio提供)来获取(适用于您的系统)。有一节“Direct3D9设备”。如果您为您的适配器展开该部分,然后是D3D设备类型->HAL->适配器格式,则会有一些部分介绍backbuffer格式及其支持的格式(我的系统附带的屏幕截图)

同样的信息在运行时也可以通过

本文档似乎说明D3D9中的后台缓冲区只支持ARGB格式,而ABGR格式未在任何支持部分中列出。这是文档中的错误还是完全不支持这种格式?

D3D9不支持渲染为ABGR格式,但理论上它可以作为一种可以采样的格式提供。然而,它并没有被普遍使用,而且从我目前的驾驶者的驾驶帽来看,它是不受支持的。最好坚持使用ARGB,它具有通用(尽管实际上没有保证)支持。

BGRA(或ARGB)格式实际上在大多数PC上更兼容,因为这是Windows GDI使用的像素格式。至少NVidia在构建GPU时考虑了Windows GDI像素格式,因此他们建议使用BGRA而不是RGBA,以避免任何昂贵的格式转换:

如果您有一个使用
D3DFMT_A8B8G8R8
的Direct3D9后缓冲区(如果Direct3D9支持),那么在每次调用
IDirect3DDevice9::Present()
时,系统(或GPU)都必须切换每个后缓冲区像素的字节,以匹配Windows GDI所期望的,这是一个非常昂贵的操作。在OpenGL上,这种性能损失实际上是显而易见的(它针对一个假设的“完美”GPU,通过在CPU上执行必要的转换,允许许多不兼容的格式组合)