2012-03-17 49 views
2

我正在使用Direct3d 11,并且遇到了一些奇怪的事情。我采用了正常的地图并将其编码为DDS文件两次。一旦用编码R8G8B8A8_SNORM,并用一次BC5_SNORM采样BC5_SNORM纹理产生不正确的值范围

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

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

+0

您确定SSD文件在第二种情况下编码正确吗? – jcoder 2012-03-19 15:11:13

+0

@JohnB我不知道你的意思。我使用** D3DX11CreateTextureFromFile **将PNG法线贴图加载为BC5_SNORM纹理,然后使用** D3DX11SaveTextureToFile **将其保存到DDS文件。我不知道那可能是什么问题。 – 2012-03-19 21:11:42

+0

好吧,这只是一个想法,也许它被错误地转换了 – jcoder 2012-03-19 21:30:39

回答

1

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

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

你可以让你的程序写出来一个临时的.dds(使用D3DX11SaveTextureToFile与R8G8B8A8_SNORM纹理),然后调用独立DirectXTex“texconv.exe”工具转换为BC5_SNORM,或缠斗DirectXTex库到您的程序并适当地使用“转换(...)”功能。