D3D11中没有三通道每通道8位DXGI纹理格式?

时间:2017-09-01 01:13:18

标签: c++ directx rendering directx-11

目前正在实施D3D11渲染器,我的大多数法线贴图都采用3通道RGB 8位/通道格式。

仔细阅读DXGI_FORMAT msdn page我注意到没有选择。这背后的原因是什么?那我怎么用这种纹理格式呢?

1 个答案:

答案 0 :(得分:1)

现在没有硬件可以支持24位格式纹理。

您现在有不同的选择:

  • 扩展到32位。您可以以额外的内存成本为代价保留位图的完整质量,无需额外的处理。
  • 使用压缩格式。这是你应该去的地方。

GPU在阅读大量未压缩纹理方面并不是最好的。当然,如果你只渲染几个模型,那就无所谓了,但是如果你开始推送大量数据,你就必须走上压缩之路。

如果您支持非常旧的硬件,则可以使用压缩选项:

  • BC1,RGB格式,每像素4位,质量最差,只有使用巨型纹理才能节省质量,或者更好,永远不要使用它。
  • BC3红色/ Alpha交换,每像素4位,稍好一点。

你应该考虑这些:

  • BC5:每像素8位,2个频道,您必须使用sqrt(1 - dot(n.xy,n.yx))或同等技巧重建Z.
  • BC7:每像素8位,3/4通道,如果您需要在正常情况下存储其他内容,最好的选择,如差异。这种格式非常好,但也非常耗费CPU,以便以最佳质量生成。

另一方面,不要忘记生成最大尺寸为1x1的mip链,它既有性能又有视觉质量。不要像你应该对你的反照率那样应用SRGB转换(0.5实际上是0.5),并且你有一些格式的选项可以使用SNORM类型来跳过典型的2*n-1公式,但是对于0情况要好看。