采样BC5_SNORM纹理会产生不正确的值范围

时间:2012-03-17 18:09:59

标签: directx direct3d directx-11 direct3d11

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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