【问题标题】:Texture Wrapping, Weird Edges纹理包裹,奇怪的边缘
【发布时间】:2016-08-07 06:53:29
【问题描述】:

我目前在坐标开始环绕的位置处遇到纹理 VBO 问题。我在纹理周围添加了一个 30px 的黄色边框,以使效果更加突出。

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

纹理坐标代码(buffer[0] = 顶点 X,buffer[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 的坐标的检查均未通过,因此它们在正确的范围内。

片段着色器:

#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);
}

垂直着色器:

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;
}

【问题讨论】:

  • % 看起来很可疑。那时你的坐标可以小于零吗?尝试在这里和那里添加一些fabs
  • 是所有的一个四边形,还是带有 [0,1] tex 坐标的多个?
  • 这是Java,对吧?
  • 我更新了问题。我在修改坐标之前和之后添加了检查。所有坐标都在 0.0-1.0 范围内。是的,这是Java,我只是添加了那个标签来指定。

标签: java glsl lwjgl


【解决方案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);

那么纹理坐标不要使用模数; [0,1] 之外的坐标将自动换行/重复:

buffer[8] = buffer[0] * s; //tx
buffer[9] = buffer[2] * s; //ty

请参阅 thisthis 了解纹理包裹的外观。

【讨论】:

  • 谢谢。我刚刚查看了我的 AssetManager,它被设置为 CLAMP_TO_EDGE 而不是 REPEAT。在改变它并移除我的模数包裹之后,纹理正确平铺。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多