在像素着色器中采样纹素值时,采样器始终返回一个 float4。但是,纹理本身可能包含基于 DXGI_FORMAT 的多种格式中的任何一种。任何 _UNORM 格式都可以确保 float4 中的所有值都在 0 和 1 之间,这似乎相当简单。回到 DirectX9 时代,人们几乎假设,无论像素格式如何,所有值采样将始终介于 0 和 1 之间。
DirectX 11 似乎不是这种情况。例如,使用 DXGI_FORMAT_R32_FLOAT 格式的纹理似乎能够存储任何有效的 32 位浮点数,这从一般的角度来看确实有意义,因为您可能没有使用该纹理(或缓冲区)用于渲染。
那么,如果 R32_FLOAT 之类的东西有这样一个任意范围,如果它不使用 0 到 1 范围,渲染管道如何确定输出的像素值呢?它似乎不是 -FLT_MAX 到 +FLT_MAX,因为我可以使用 0.0-65.0 之间的值渲染这种类型的纹理,并且我在最终结果中看到红色。但是调试像素着色器并查看源纹理,只有真正接近 65.0 的值才实际显示为红色。但是,后台缓冲区的最终渲染结果中有很多红色。
这是一个示例源纹理,如 VS 图形调试器中所示:
如果我仅使用像素着色器的基本采样器输出将其渲染到屏幕上,我会得到:
后台缓冲区格式为 R10G10B10A10_UNORM。
那么它如何决定浮点纹理的“最大强度”是多少?同样,如果您使用 _SINT 格式之一,它是如何处理的?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句