1

我有以下片段和顶点着色器,我在其中重复纹理:

//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,尽管所有必要的信息都应包含在此处。

在此处输入图像描述 最后一张图片没有添加时间。

UV 的坐标为绿色、蓝色和红色作为纹理通道。

另一个没有红色

4

1 回答 1

2

查看 UV 坐标的渲染,它们正在被过滤,这将导致与您之前的问题相同的问题,但规模较小。发生的情况是,通过在两个不连续值之间的点(即纹理坐标包裹的两个相邻点)对 UV 坐标纹理进行采样,您会得到一个不在纹理右侧的插值值。因此,纹理图块之间的边界是来自整个图块的一堆像素。

在此处输入图像描述

您需要在屏幕像素和捕获的 UV 值之间获得 1:1 的映射。使用最近的采样可能会让您有一些方法,但如果您首先拥有正确的纹理和像素坐标,则应该可以不使用它。

其次,您可能会发现由于您执行纹理图集查找的方式而产生出血效果,因为您没有考虑对纹素进行采样的方式。如果您使用任何 mipmapping,这将被放大。理想情况下,您需要一个边框,并且可能需要对坐标进行一些按摩以解决半纹素偏移。但是,我认为这不是您在这里看到的主要问题。

于 2013-01-27T12:52:33.007 回答