0

我在顶点着色器中重复纹理(用于存储,而不是在现场重复)。这是正确的方法吗?我似乎在某些地方失去了精确度。

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),但我使用的是我懒得编辑的模型加载器,因为我认为这不是必要的/不是最简单的方法。

4

1 回答 1

1

有(至少)两种可能出错的方式:

首先是的,你会失去精度。放大后,您实际上是在取浮点数的小数部分。这基本上会丢弃一些数字。

其次,这可能无论如何都行不通,不适用于大多数典型用途。您正在尝试按顶点平铺纹理,但纹理是跨多边形插值的。所以这种技术可能会在同一个多边形的不同顶点上以不同的方式平铺纹理,从而导致一些混乱。

IE

如果顶点 1 的 U 为 1.5(缩放后),而顶点 2 的 U 为 2.2,那么您希望插值在这些点之间给出递增的值,中间点的 U 为 1.85。

如果你在每个顶点取模,你将分别得到一个 0.5 的 U 和一个 0.2 的 U,导致U减小,以及一个 U 为 0.35 的中间点......

只需在纹理/采样器上启用平铺,并使用 0->1 范围之外的坐标,就可以平铺纹理。如果您真的想提高采样精度并进行大量平铺,则需要将 UV 坐标均匀地包裹在整个多边形上,而不是每个顶点。即在您的数据中进行,而不是在顶点着色器中进行。

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

但是,我仍然认为您会丢失所有子像素信息,因此会遇到精度问题。这是否是您使用的技术的问题,我不知道。

于 2013-01-21T15:00:09.730 回答