顶点到像素着色器 TEXCOORD 插值精度问题
Vertex to Pixel Shader TEXCOORD interpolation precision issues
我认为我在读取从顶点着色器插值的纹理坐标时遇到了像素着色器的精度问题。
我的场景由一些非常大的三角形组成(边长达 5000 个单位,纹理坐标从 0 到 5000 个单位不等,因此纹理平铺了大约 5000 次),我有一个相机正在寻找非常靠近其中一个三角形(相机可能太近了,以至于它的视口只覆盖了几米的大三角形)。当我沿着三角形的平面平移相机时,纹理滞后且跳跃。我的想法是,我的插值纹理坐标不够精确。
有没有办法提高纹理坐标插值的精度?
我的第一个想法是让 texcoord u 以双精度存储在 xy 组件中,而 texcoord v 存储在 zw 组件中。但我想这不会起作用,因为着色器插值假设有 4 个独立的单精度分量,而不是 2 个双精度分量?
如果着色器方面没有解决方案,我想我只需要将三角形镶嵌成更细的碎片?不过,我不想仅仅为了这个问题而这样做。有什么想法吗?
编辑:当在屏幕上将纹理坐标打印为颜色时,问题也很明显,根本没有任何实际的纹理采样。
你是对的,这看起来像是一个精度问题。如果您的卡支持它,您确实可以使用双精度浮点数进行插值。只需将变量声明为 dvec2 即可。
着色器插值不假定有 4 个独立的 8 位组件。在最近的卡片中,每个标量(即 vec 中的分量)作为浮点数(或双精度数)单独插值。只能插入 vec4 的旧卡也可以使用完整的浮点数(但这些可能不支持双精度数)。
我认为我在读取从顶点着色器插值的纹理坐标时遇到了像素着色器的精度问题。
我的场景由一些非常大的三角形组成(边长达 5000 个单位,纹理坐标从 0 到 5000 个单位不等,因此纹理平铺了大约 5000 次),我有一个相机正在寻找非常靠近其中一个三角形(相机可能太近了,以至于它的视口只覆盖了几米的大三角形)。当我沿着三角形的平面平移相机时,纹理滞后且跳跃。我的想法是,我的插值纹理坐标不够精确。
有没有办法提高纹理坐标插值的精度?
我的第一个想法是让 texcoord u 以双精度存储在 xy 组件中,而 texcoord v 存储在 zw 组件中。但我想这不会起作用,因为着色器插值假设有 4 个独立的单精度分量,而不是 2 个双精度分量?
如果着色器方面没有解决方案,我想我只需要将三角形镶嵌成更细的碎片?不过,我不想仅仅为了这个问题而这样做。有什么想法吗?
编辑:当在屏幕上将纹理坐标打印为颜色时,问题也很明显,根本没有任何实际的纹理采样。
你是对的,这看起来像是一个精度问题。如果您的卡支持它,您确实可以使用双精度浮点数进行插值。只需将变量声明为 dvec2 即可。
着色器插值不假定有 4 个独立的 8 位组件。在最近的卡片中,每个标量(即 vec 中的分量)作为浮点数(或双精度数)单独插值。只能插入 vec4 的旧卡也可以使用完整的浮点数(但这些可能不支持双精度数)。