【问题标题】:What are 'typeless' DXGI texture formats in DirectX?DirectX 中的“无类型”DXGI 纹理格式是什么?
【发布时间】:2020-09-21 07:57:10
【问题描述】:

directX 中有多种纹理格式: https://docs.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format

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

DXGI_FORMAT_BC6H_TYPELESS,
DXGI_FORMAT_BC6H_UF16,
DXGI_FORMAT_BC6H_SF16,

UF16 是无符号浮点数,SF16 是有符号浮点数,至少编码器https://docs.microsoft.com/en-us/windows/win32/direct3d11/bc6h-format(也可能是解码器?)似乎关心格式是有符号还是无符号。

但是“无类型”是什么意思?这样的纹理是如何编码和解码的?

【问题讨论】:

标签: compression gpu directx textures directx-11


【解决方案1】:

DXGI 格式的“无类型”变体适用于可以更改数据解释方式的特殊情况。这允许您使用正确的硬件内存布局(即使用_TYPELESS 格式)创建资源(即实际的“位包”),然后您可以使用您的特定类型创建多个视图对象想。这可以有效地让您在有限的情况下执行相当于“C++ 强制转换”的操作。

使用无类型的最常见情况是处理深度/模板格式、进行 RGB 混合着色器以及在 DirectCompute 中实现 BC 编解码器。这不是您经常使用的东西,但是当您这样做时,放松类型验证的选项会派上用场。

有关使用无类型 DXGI 格式的一些示例,请参阅 directx-sdk-samples GitHub 并查看 AdaptiveTessellationCS40BasicCompute11CascadedShadowMaps11MultithreadedRendering11VarianceShadows11

对于 Xbox 开发,_TYPELESS 还可以派上用场,因为它是统一内存访问 (UMA) 架构,但这些情况违反了“普通”Direct3D 的验证规则。

参见Microsoft DocsDirect3D 11.3 specification

【讨论】:

  • 但在 DXGI_FORMAT_BC6H 的情况下这是否有意义?有符号的 BC6h 纹理的位不是被解释为无符号的完全乱码吗?反之亦然?
  • 这很可能是胡言乱语。就像使用 C/C++ 强制转换一样。 BC6H 的特殊情况很奇怪,但这只是一个特殊情况。大多数 DXGI 格式都分为“无类型组”。
  • 另外请注意,这意味着硬件必须使用相同的物理显存布局 DXGI_FORMAT_BC6H_UF16DXGI_FORMAT_BC6H_SF16 在 swizzling/tiling、stride、mip-map 布局等方面。你如何 解释数据当然是基于 UF16 与 SF16 的实际选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多