D3D11 中没有三分量每通道 8 位 DXGI 纹理格式吗?
No three-component 8bits-per-channel DXGI texture format in D3D11?
目前正在实施 D3D11 渲染器,我的大部分法线贴图都是 3 通道 RGB 8 位/通道格式。
浏览 DXGI_FORMAT msdn page 我注意到没有这个选项。这背后的原因是什么?那么我该如何使用这种纹理格式呢?
十年来没有支持 24 位格式纹理的硬件。
您现在有不同的选择:
- 扩展到 32 位。您以额外的内存成本为代价保留了位图的完整质量,不需要额外的处理。
- 使用压缩格式。这是你应该去的地方。
GPU 不擅长读取大量未压缩的纹理。当然,如果你只是渲染几个模型,那无所谓,但如果你开始推更大的数据量,那你就得走压缩之路了。
如果您支持非常旧的硬件,您的压缩选项:
- BC1,每像素 4 位的 RGB 格式,质量最差,只有在保存超过质量时才使用巨型纹理,或者更好的是,永远不要使用它。
- BC3 与 Red/Alpha 交换,每像素 4 位,稍微好一点。
你应该考虑这些:
- BC5:每像素 8 位,2 个通道,您必须使用
sqrt(1 - dot(n.xy,n.yx))
或等效技巧重建 Z。
- BC7:每像素 8 位,3/4 通道,如果你需要用你的法线存储其他东西,比如方差,这是最好的选择。这种格式很棒,但也非常 CPU 密集生成最佳质量。
附带说明一下,不要忘记生成最大 1x1 大小的 mip 链,这既是为了性能又是为了视觉质量。不要像对反照率(0.5 实际上是 0.5)那样应用 SRGB 转换,并且您可以选择使用某些格式来使用 SNORM 类型来跳过典型的 2*n-1
公式,但要小心 0 的情况。
目前正在实施 D3D11 渲染器,我的大部分法线贴图都是 3 通道 RGB 8 位/通道格式。
浏览 DXGI_FORMAT msdn page 我注意到没有这个选项。这背后的原因是什么?那么我该如何使用这种纹理格式呢?
十年来没有支持 24 位格式纹理的硬件。
您现在有不同的选择:
- 扩展到 32 位。您以额外的内存成本为代价保留了位图的完整质量,不需要额外的处理。
- 使用压缩格式。这是你应该去的地方。
GPU 不擅长读取大量未压缩的纹理。当然,如果你只是渲染几个模型,那无所谓,但如果你开始推更大的数据量,那你就得走压缩之路了。
如果您支持非常旧的硬件,您的压缩选项:
- BC1,每像素 4 位的 RGB 格式,质量最差,只有在保存超过质量时才使用巨型纹理,或者更好的是,永远不要使用它。
- BC3 与 Red/Alpha 交换,每像素 4 位,稍微好一点。
你应该考虑这些:
- BC5:每像素 8 位,2 个通道,您必须使用
sqrt(1 - dot(n.xy,n.yx))
或等效技巧重建 Z。 - BC7:每像素 8 位,3/4 通道,如果你需要用你的法线存储其他东西,比如方差,这是最好的选择。这种格式很棒,但也非常 CPU 密集生成最佳质量。
附带说明一下,不要忘记生成最大 1x1 大小的 mip 链,这既是为了性能又是为了视觉质量。不要像对反照率(0.5 实际上是 0.5)那样应用 SRGB 转换,并且您可以选择使用某些格式来使用 SNORM 类型来跳过典型的 2*n-1
公式,但要小心 0 的情况。