Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 顶点到像素着色器TEXCOORD插值精度问题_Opengl_Shader_Hlsl_Fragment Shader_Cg - Fatal编程技术网

Opengl 顶点到像素着色器TEXCOORD插值精度问题

Opengl 顶点到像素着色器TEXCOORD插值精度问题,opengl,shader,hlsl,fragment-shader,cg,Opengl,Shader,Hlsl,Fragment Shader,Cg,我想我在读取从顶点着色器插值的texcoords时遇到了像素着色器的精度问题 我的场景由一些非常大的三角形组成(边长高达5000个单位,texcoords从0到5000个单位不等,因此纹理平铺了大约5000次),我有一个摄像头,可以非常近距离地观察其中一个三角形(相机可能太近了,以至于它的视口只覆盖了几米的大三角形)。当我沿着三角形平面平移相机时,纹理滞后且跳跃。我的想法是,插值的texcoords缺少精度 有没有办法提高texcoords插值的精度 我的第一个想法是让texcoord u在xy

我想我在读取从顶点着色器插值的texcoords时遇到了像素着色器的精度问题

我的场景由一些非常大的三角形组成(边长高达5000个单位,texcoords从0到5000个单位不等,因此纹理平铺了大约5000次),我有一个摄像头,可以非常近距离地观察其中一个三角形(相机可能太近了,以至于它的视口只覆盖了几米的大三角形)。当我沿着三角形平面平移相机时,纹理滞后且跳跃。我的想法是,插值的texcoords缺少精度

有没有办法提高texcoords插值的精度

我的第一个想法是让texcoord u在xy组件中以双精度存储,texcoord v在zw组件中以双精度存储。但我猜这不会起作用,因为着色器插值假设有4个单独的单精度组件,而不是2个双精度组件

如果在着色器方面没有解决方案,我想我只能将三角形细分为更精细的片段?不过我不想只为这个问题这么做..有什么想法吗


编辑:当在屏幕上以颜色打印texcoords时,这个问题也很明显,根本没有任何实际的纹理采样。

你是对的,它看起来像是一个精度问题。如果你的卡支持它,你确实可以使用双精度浮点进行插值。只需将变量声明为dvec2,它就可以工作了


着色器插值不假设有4个独立的8位组件。在最近的卡中,每个标量(即vec中的组件)都作为浮点(或双精度)单独插值。只能插值VEC4的旧卡也使用全浮点(但这些卡可能不支持双精度).

您是否验证了texcoords的浮点精度确实是问题所在?我不确定是否是问题所在,但请允许我猜测:当对纹理进行采样时,纹理坐标会转换为定点,通常具有8位分数精度。这意味着两个t之间只有256个离散的等距位置exels,您可以在其中进行采样。或者,换一种方式说:如果将纹理放大256倍以上,您将获得带状瑕疵。几天前我遇到过类似问题。我通过使纹理变大来停止带状(但是的,这是一个非常愚蠢的解决方案)。有没有关于如何避免@derhass问题的建议?问题不在于纹理采样。我只是尝试将uv坐标输出到返回的像素着色器颜色,没有任何纹理采样,但仍然遇到相同的问题。我没有放大纹理。由于纹理坐标的范围为顶点位置的0-5000,因此纹理是平铺的ng 5000次,这意味着从我的特写相机上看,纹理与视口大小非常一致。我遇到的视觉问题不是真正的带状。这更像是纹理坐标相对于相机运动滞后。例如,如果我在100帧上平移相机5厘米,纹理坐标每个像素的(或采样纹理颜色)似乎不会改变每个帧,而是像每个第20帧一样,即每1厘米的相机移动。(这些数字只是获得想法的示例,而不是实际测量值)。好的。这是GLSL语法吗?我正在使用cg。从float2更改为double2会编译,但会导致相同的问题。经过一些测试,我发现cg可能会将double视为float,在此处确认:“cg允许配置文件忽略对int和其他整数类型的运行时支持。cg允许配置文件将double视为float。”.我可能太低调了(ps_3_0),但cg api中似乎没有重载将double带到任何地方。无论如何,我尝试了网格细分,现在就可以了。感谢您的回复。我对您的最后一段有点困惑。我只是想澄清一下;如果我使用的是不支持dvec2的旧卡/配置文件,我可以解决插值精度问题吗?我怎么想ant只是所有卡(旧卡和新卡)都使用32位(或24位)浮点进行插值(而且永远不会少)。但是显然,在您的情况下,32位浮点是不够的,所以细分是唯一的解决方案。