在着色器中重复和夹紧的纹理

时间:2013-01-26 18:30:43

标签: opengl glsl

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

//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();

ADDED:在此过程之后,我获取纹理坐标并使用纹理包:

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)无济于事。我强烈地感觉到某处是一个舍入错误,但我不知道在哪里。 ADDED:需要注意的是,在实际情况下,我将texcoordC x和y转换为8位浮点数。我认为原因在于此;我添加了另一个着色器,描述了上述内容。

我展示的情况实际上有点复杂,所以在着色器(!)之外我没有用。我添加了上一个问题,该问题解释了一些案例。

编辑:正如您所见,自然纹理跨度除以10,纹理重复(10次)。接缝出现在每个重复纹理的边界处。我还添加了截图。接缝是非常细的线条(~1像素)。图片是截图中的剪切,未缩放。重复纹理为16x16,总共256个子像素。 Seams

编辑:这是一个后续问题:this question,尽管这里应包含所有必要的信息。

enter image description here 最后一张照片没有添加时间。

The UV's coordinates as green,blue and red as the texturetile channel.

Another without red

1 个答案:

答案 0 :(得分:2)

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

enter image description here

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

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

相关问题