纹理包裹,奇怪的边缘

时间:2016-08-06 22:25:43

标签: java glsl lwjgl

我目前在坐标开始环绕的地方遇到纹理VBO的问题。我在纹理周围添加了一个30px的黄色边框,使效果更加突出。 enter image description here

当仔细观察时,它看起来几乎就像整个纹理被压扁并涂抹在黄色线条之间。

enter image description here

纹理坐标代码(缓冲区[0] =顶点X,缓冲区[2] =顶点Y):

if ((buffer[0] * s) < 0) Logger.logDebug(buffer[8]+","+buffer[9]);
if ((buffer[2] * s) < 0) Logger.logDebug(buffer[8]+","+buffer[9]);
buffer[8] = (buffer[0] * s) % 1f; //tx
buffer[9] = (buffer[2] * s) % 1f; //ty
if (buffer[8] > 1f || buffer[9] > 1f) Logger.logDebug(buffer[8]+","+buffer[9]);
if (buffer[8] < 0f || buffer[9] < 0f) Logger.logDebug(buffer[8]+","+buffer[9]);

对于低于0或高于1的坐标,我的检查均未通过,因此它们位于正确的范围内。

Frag Shader:

#version 150 core

uniform sampler2D texture1;
in vec4 vColor;

in vec4 pass_Color;
in vec2 pass_texCoord;
out vec4 out_Color;

void main()
{
    out_Color = pass_Color;
    out_Color = texture(texture1, pass_texCoord.st);
}

Vert Shader:

uniform mat4 projection = mat4(
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0);
uniform mat4 view = mat4(
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0,
                        1.0, 1.0, 1.0, 1.0);
uniform vec4 overrideColor = vec4(-1,-1,-1,-1);

in vec4 in_Color;
in vec4 in_Position;
in vec2 texCoord;

out vec4 pass_Color;
out vec2 pass_texCoord;

void main()
{
    gl_Position = projection * view * gl_Vertex;
    if (overrideColor == vec4(-1,-1,-1,-1))
    {
        pass_Color = in_Color;
    }
    else
    {
        pass_Color = overrideColor;
    }
    pass_texCoord = texCoord;
}

1 个答案:

答案 0 :(得分:2)

你正在使用一个精细的四边形网格并试图在它们之间包裹一个大的纹理,对吧?我认为问题是一些四边形跨越了包裹边界。你应该确保包裹边界恰好出现在四边形的边缘,或者正如我所建议的那样,只需设置你的纹理来包裹:

for idx=1, 5 do
  if cond_1() then else return end
  if cond_2() then else return end
  if cond_3() then else return end
  if cond_4() then else return end
  the_core_logic_goes_here()
end

然后不要使用模数作为纹理坐标; [0,1]外的坐标会自动换行/重复:

// when you set up your texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

请参阅thisthis了解纹理包装的效果。