首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Direct3D9中支持的纹理格式

Direct3D9中支持的纹理格式
EN

Stack Overflow用户
提问于 2017-01-08 01:12:18
回答 2查看 1.8K关注 0票数 4

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

在D3D11方面,我的后台缓冲区使用的是DXGI_FORMAT_R8G8B8A8_UNORM格式,这很好。根据这份文件,DXGI_FORMAT_R8G8B8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,当我使用该格式在D3D9端创建纹理时,它会失败。我使用的是Windows10,并且没有D3D9调试运行时,所以我得到的结果是一个没有附加信息的D3DERR_INVALIDCALL。

这份文件似乎说,D3D9中的back缓冲区只支持ARGB格式,支持的任何部分中都没有列出ABGR格式。这是文档中的错误还是这种格式完全不受支持?

如果我在D3D11端使用DXGI_FORMAT_B8G8R8A8_UNORM,在D3D9侧使用D3DFMT_A8R8G8B8,那么纹理创建就会成功。

为了进一步混淆,这个职位暗示DXGI_FORMAT_R8G8B8A8_UNORM应该是更兼容的格式,但这是我遇到麻烦的格式。

我还向Microsoft互操作示例 on GitHub确认了这种行为。开箱即用的是DXGI_FORMAT_R8G8B8A8_UNORM,工作正常,但是如果我将back缓冲区更改为DXGI_FORMAT_B8G8R8A8_UNORM,它就会中断。

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

EN

回答 2

Stack Overflow用户

发布于 2017-02-10 02:32:20

坚持DXGI_FORMAT_B8G8R8A8_UNORM在D3D11侧,D3DFMT_A8R8G8B8在D3D9中。虽然DXGI_FORMAT_R8G8B8A8_UNORM在技术上更兼容,但如果您不需要D3D10支持,那么所有D3D11设备都应该支持它。

如何确定在D3D9?中支持哪种格式

您可以使用“”(随Windows附带的DirectX Caps它与Visual的最新版本一起提供)来获得这个(对于您的系统)。有一节"Direct3D9设备“。如果对适配器进行扩展,然后D3D设备类型为-> HAL ->适配器格式,则有反缓冲区格式的部分,以及它们支持的格式(从我的系统附带的屏幕截图)。

这些信息可以在运行时通过IDirect3D9::CheckDeviceFormat获得。

--这个文档似乎说,D3D9中的back缓冲区只支持ARGB格式,支持的任何部分中都没有列出ABGR格式。这是文档中的错误还是这种格式完全不受支持?

D3D9不支持将其呈现为ABGR格式,但从理论上讲,它可以作为一种可以采样的格式使用。然而,它并不是普遍使用的,而且从我当前的驾驶员帽来看,它是不受支持的。最好坚持ARGB,它具有通用的(虽然不是真正的保证)支持。

票数 2
EN

Stack Overflow用户

发布于 2017-04-11 12:43:16

BGRA (或ARGB)格式实际上在大多数PC上更兼容,因为这是Windows使用的像素格式。至少NVidia在构建GPU时考虑到了Windows像素格式,因此他们建议使用BGRA而不是RGBA来绕过任何代价高昂的格式转换:Transfers.pdf

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41528409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档