Opengl GLSL中mod的精度损失

Opengl GLSL中mod的精度损失,opengl,glsl,Opengl,Glsl,我在顶点着色器中重复纹理(用于存储,而不是在点处重复)。这条路对吗?我好像有点不准确了 varying vec2 texcoordC; texcoordC = gl_MultiTexCoord0.xy; texcoordC *= 10.0; texcoordC.x = mod(texcoordC.x, 1.0); texcoordC.y = mod(texcoordC.y, 1.0); 添加:然后我保存(存储)颜色的texcoord,将其打印到纹理,然后再次使用该纹理。当我从纹理中检索颜色时

我在顶点着色器中重复纹理(用于存储,而不是在点处重复)。这条路对吗?我好像有点不准确了

varying vec2 texcoordC;

texcoordC = gl_MultiTexCoord0.xy;
texcoordC *= 10.0;
texcoordC.x = mod(texcoordC.x, 1.0);
texcoordC.y = mod(texcoordC.y, 1.0);
添加:然后我保存(存储)颜色的texcoord,将其打印到纹理,然后再次使用该纹理。当我从纹理中检索颜色时,我会找到texcoords并使用它们在后处理中应用纹理。我想这样做是有原因的,我不会去探究。我知道texcoords会受到颜色精度的限制,这没关系,因为我的纹理宽度和高度都是256

我知道通常我会将带有glTexcoord2f的texcoords设置为高于1.0以重复(并使用GL_repeat),但我使用的是一个我懒得编辑的modelloader,因为我认为这不是必要的/不是最简单的方法。

这可能(至少)有两种方法出错:

首先是的,你会失去精确度。在放大浮点数后,实际上是取其小数部分。这实质上是丢掉了一些数字

其次,这可能无论如何都不起作用,对于大多数典型的用途来说也不起作用。您正在尝试逐顶点平铺纹理,但纹理是跨多边形插值的。因此,这种技术可以在同一多边形的不同顶点上以不同的方式平铺纹理,从而造成一点混乱

i、 e

如果顶点1的U值为1.5(缩放后),而顶点2的U值为2.2,则期望插值在这些点之间提供递增的值,中间点的U值为1.85

如果在每个顶点取模,则U值分别为0.5和0.2,导致U值减小,而中间点的U值为0.35

纹理可以平铺,只需在纹理/采样器上启用平铺,并使用范围0->1之外的坐标即可。如果确实希望提高采样精度并进行大量平铺,则需要在整个多边形上均匀包裹UV坐标,而不是逐顶点包裹。i、 e.在数据中执行此操作,而不是在顶点着色器中

对于您的情况,如果您尝试将UV坐标输出到缓冲区以供以后使用,则可以在像素着色器中钳制/包裹UV。因此,将顶点着色器中的UV相乘,在多边形上正确插值,然后仅在写入缓冲区时应用模


然而,我仍然认为你会有精度问题,因为你会丢失所有的亚像素信息。我不知道你使用的技术是否有问题。

你说的“失去精度”是什么意思?至少有两种方法可以破坏你的纹理。如果纹理是256px宽的,它的效果似乎要小得多。身高也一样。我在之前和之后尝试了乘法和除法,但都没有用。我仍然不完全清楚你的意思(一张图片会有帮助!),但我已经尝试了一个答案——我认为你尝试的方法行不通。感谢你抽出时间,我试着进一步解释我的问题,详细说明了我为什么这样做。这有点复杂。8位精度不高,即使是256x256纹理,因为您会丢失所有的亚像素信息。不过,我建议了一种解决模问题的方法,即在像素着色器中而不是在顶点着色器中进行模运算。事实上,我将gl_MultiTexCoord0(可变texcoordC)存储在像素着色器中,而不是在顶点着色器中。这就是你的意思,对吗?是的,无论你计算和存储什么值以供以后查找,都不要在像素着色器出现之前对其进行包装/钳制。