2

我正在使用 Direct3d 11,我遇到了一些奇怪的事情。我已经拍摄了一张法线贴图并将其编码为 DDS 文件两次。一次使用R8G8B8A8_SNORM编码,一次使用BC5_SNORM

接下来我使用D3DX11CreateShaderResourceViewFromFileD3DX11GetImageInfoFromFile加载每个纹理。当我在像素着色器中对这些纹理进行采样时,我发现R8G8B8A8_SNORM纹理返回的值在 [-1,1] 范围内,这是我对 SNORM 纹理的期望。但是,BC5_SNORM纹理返回的值在 [0,1] 范围内,这对我来说没有任何意义。

我用我的调试器和 PIX 进行了三重检查。纹理的格式是正确的(BC5_*S*NORM),所以我不知道为什么它不返回有符号值。

4

1 回答 1

1

我设法重现了与您相同的问题,并且在通过 D3Dx11LoadTextureFromTexture 进行从 R8G8B8A8_SNORM 纹理(具有 -1 到 +1 值)到BC5_SNORM(仅产生 0 到 1 值)的转换时,我也得到了相同的行为。D3DX11 中似乎确实存在错误,至少在 BC5_SNORM 方面,因为无论各种输入格式如何,(BC5)SNORM 输出始终在 0 到 1 范围内。

正如@chuckwalbourn 所建议的那样,我可以确认取代现已弃用的 D3DX11 的DirectXTex实用程序确实尊重并正确处理 BC5_SNORM 输出的有符号值。

您可以让您的程序写出一个临时的 .dds(使用带有R8G8B8A8_SNORM纹理的 D3DX11SaveTextureToFile),然后调用独立的 DirectXTex 'texconv.exe' 实用程序来转换为 BC5_SNORM,或者将 DirectXTex 库写入您的程序并使用“Convert (...)' 功能适当。

于 2014-07-22T13:19:58.657 回答