我在顶点着色器中重复一个纹理(用于存储,而不是在点处重复)。这是正确的方法吗?我似乎失去了精确度。
varying vec2 texcoordC;
texcoordC = gl_MultiTexCoord0.xy;
texcoordC *= 10.0;
texcoordC.x = mod(texcoordC.x, 1.0);
texcoordC.y = mod(texcoordC.y, 1.0);
ADDED:然后我将texcoord保存(存储)为颜色,将其打印到纹理,然后再次使用该纹理。当我从纹理中检索颜色时,我找到了texcoords并使用它们在后处理中应用纹理。我有这样一个理由,我不会这样做。我知道texcoords会受到颜色精度的限制,这就好了,因为我的纹理宽度和高度都是256。
我通常知道我会将glTexcoord2f的texcoords设置为高于1.0以重复(并使用GL_REPEAT),但我使用的是模型加载器,我懒得编辑,因为我认为这不是必须/不是最简单的方式。
答案 0 :(得分:1)
(至少)有两种方法可能会出错:
首先是的,你会失去精确度。在扩展它之后,你基本上是浮点数的小数部分。这基本上会抛出一些数字。
其次,这可能无论如何都不会起作用,不适用于大多数典型用途。您正在尝试平铺每个顶点的纹理,但是纹理是在多边形上插值的。因此,这种技术可以在同一多边形的不同顶点上平铺纹理,导致一些混乱。
即
如果vertex1的U为1.5(缩放后),并且vertex2的U为2.2,那么您希望插值在这些点之间给出增加的值,中间点的U为1.85。
如果你在每个顶点取模数,你的U分别为0.5,U分别为0.2,导致减少 U,并且U的中间点为U 0.35 ...
纹理可以平铺,只需在纹理/采样器上启用平铺,并使用范围0-> 1之外的坐标。如果您真的想要提高采样精度并且需要大量的平铺,则需要将UV坐标均匀地包裹在整个多边形上,而不是每个顶点。即在数据中进行,而不是在顶点着色器中进行。
对于您的情况,您尝试将UV坐标输出到缓冲区以用于以后的目的,您可以在像素着色器中夹紧/包裹UV。因此,将顶点着色器中的UV相乘,正确地在多边形上进行插值,然后仅在写入缓冲区时应用模数。
但是我仍然认为你会因为丢失所有子像素信息而出现精确问题。对于你正在使用的技术来说,这是否是一个问题,我不知道。