我有以下片段和顶点着色器,我在其中重复纹理:
//Fragment
vec2 texcoordC = gl_TexCoord[0].xy;
texcoordC *= 10.0;
texcoordC.x = mod(texcoordC.x, 1.0);
texcoordC.y = mod(texcoordC.y, 1.0);
texcoordC.x = clamp(texcoordC.x, 0.0, 0.9);
texcoordC.y = clamp(texcoordC.y, 0.0, 0.9);
vec4 texColor = texture2D(sampler, texcoordC);
gl_FragColor = texColor;
//Vertex
gl_TexCoord[0] = gl_MultiTexCoord0;
colorC = gl_Color.r;
gl_Position = ftransform();
添加:在此过程之后,我获取纹理坐标并使用纹理包:
vec4 textureGet(vec2 texcoord) {
// Tile is 1.0/16.0 part of texture, on x and y
float tileSp = 1.0 / 16.0;
vec4 color = texture2D(sampler, texcoord);
// Get tile x and y by red color stored
float texTX = mod(color.r, tileSp);
float texTY = color.r - texTX;
texTX /= tileSp;
// Testing tile
texTX = 1.0 - tileSp;
texTY = 1.0 - tileSp;
vec2 savedC = color.yz;
// This if else statement can be ignored. I use time to move the texture. Seams show without this as well.
if (color.r > 0.1) {
savedC.x = mod(savedC.x + sin(time / 200.0 * (color.r * 3.0)), 1.0);
savedC.y = mod(savedC.y + cos(time / 200.0 * (color.r * 3.0)), 1.0);
} else {
savedC.x = mod(savedC.x + time * (color.r * 3.0) / 1000.0, 1.0);
savedC.y = mod(savedC.y + time * (color.r * 3.0) / 1000.0, 1.0);
}
vec2 texcoordC = vec2(texTX + savedC.x * tileSp, texTY + savedC.y * tileSp);
vec4 res = texture2D(texturePack, texcoordC);
return res;
}
但是,我在显示接缝(似乎是 1 像素)时遇到了一些麻烦。如果我省略 texcoord *= 10.0 ,则不会显示(或几乎不显示)接缝,如果我将其留在其中,它们会出现。我钳制坐标(甚至尝试低于 1.0 和大于 0.0)无济于事。我强烈地感觉它是某个地方的舍入错误,但我不知道在哪里。补充:需要注意的是,在实际情况下,我将 texcoordC x 和 y 转换为 8 位浮点数。我认为原因就在这里;我在上面添加了另一个着色器来描述这一点。
我展示的案例在现实中要复杂一些,所以我在着色器之外没有用(!)。我添加了前面的问题,它解释了这个案例。
编辑:如您所见,自然纹理跨度除以 10,纹理重复(10 次)。接缝出现在每个重复纹理的边界处。我还添加了一个屏幕截图。接缝是非常细的线(~1pixel)。图片是从屏幕截图中截取的,未按比例缩放。重复纹理为 16x16,总共 256 个子像素。
编辑:这是一个后续问题:this question,尽管所有必要的信息都应包含在此处。
最后一张图片没有添加时间。