DirectX中的“无类型”DXGI纹理格式是什么?

3

DirectX中有各种纹理格式:https://learn.microsoft.com/zh-cn/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format

大多数都很清晰,但是什么是“无类型”纹理?例如,对于BC6H,有:

DXGI_FORMAT_BC6H_TYPELESS,
DXGI_FORMAT_BC6H_UF16,
DXGI_FORMAT_BC6H_SF16,

UF16表示无符号浮点数,SF16表示有符号浮点数,至少编码器(https://learn.microsoft.com/en-us/windows/win32/direct3d11/bc6h-format)(也许解码器也是如此?)似乎在意格式是有符号还是无符号。

但是什么是“typeless”?这样的纹理是如何编码和解码的呢?


请参阅“格式修饰符”、“_TYPELESS” https://learn.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format#format-modifiers。 - Simon Mourier
文档说明了“当未指定类型的资源绑定到着色器时,应用程序或者着色器必须解析格式类型”,那么着色器如何解析格式类型呢? - matthias_buehlmann
例如,当您从无类型纹理创建着色器资源视图时,可以指定具有不同类型格式的区域:https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ns-d3d11-d3d11_shader_resource_view_desc#remarks - Simon Mourier
1个回答

1
"无类型"的DXGI格式变体是用于特殊情况下更改数据解释方式的。这使您可以使用正确的硬件内存布局(即使用_TYPELESS格式)创建资源(即实际的“位袋”),然后您可以使用所需的特定类型创建多个视图对象。在有限情况下,这有效地让您执行“C ++转换”的等效操作。
最常见的使用无类型的情况是处理深度/模板格式,在着色器中进行RGB交换以及在DirectCompute中实现BC编解码器。这不是经常使用的东西,但当您需要时,放宽类型验证的选项非常方便。
有关使用无类型DXGI格式的示例,请参见directx-sdk-samples GitHub,并查看AdaptiveTessellationCS40、BasicCompute11、CascadedShadowMaps11、MultithreadedRendering11和VarianceShadows11。"
对于 Xbox 开发,有一些情况下 _TYPELESS 非常有用,因为它是一种统一内存访问(UMA)架构,但这些情况违反了“标准” Direct3D 的验证规则。

请参阅 Microsoft DocsDirect3D 11.3 specification


但是在DXGI_FORMAT_BC6H的情况下,这是否有意义呢?一个带符号的BC6h纹理的位是否被解释为无符号的完全是胡言乱语,反之亦然。 - matthias_buehlmann
这可能是无意义的。就像在C/C++中进行转换一样。BC6H的特殊情况很奇怪,但它只是一个具体的案例。大多数DXGI格式都被分组为“无类型组”。 - Chuck Walbourn
还要注意的是,这意味着硬件在交错/平铺、步幅、mip-map布局等方面必须使用相同的物理视频内存布局“DXGI_FORMAT_BC6H_UF16”和“DXGI_FORMAT_BC6H_SF16”。当然,如何解释这些数据取决于实际选择UF16还是SF16。 - Chuck Walbourn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接