编写用于重新缩放浮点纹理的 HLSL 着色器

Writing a HLSL shader for rescaling floating point textures

当我的 Texture2D 使用 HalfSingle/Single 格式时,XNA 抱怨采样必须设置为 PointClamp,这使我的纹理看起来参差不齐。我实际上是用它来将深度数据传递给着色器,所以我试图获得比简单地使用 RGBA 灰度值更好的动态范围。

如果我用ColorBgra,那我基本上只有255级。如果我将深度值编码为彩色像素,那么我可以启用抗锯齿功能,但它无法正常工作,因为采样器在 lerping 时会分别处理每个 byte/nibble。

问题:

有没有办法告诉 HLSL 使用抗锯齿过滤器对我的浮点纹理进行采样,或者我需要自己编写着色器?

原来有两种方法可以解决这个问题:

  1. 使用我自己的转换方法将 .NET 32 位浮点数打包成 RGBA,或者

  2. SurfaceFormat.Rg32将两个16位的浮点数打包成RGBA(这种格式支持纹理过滤)

我选择了第一种方法。