OpenGL 2d渲染中的奇怪边缘

时间:2014-05-19 15:36:30

标签: java opengl lwjgl

正如你所看到的那样,箭头旁边有一些奇怪的边缘。

这是我的OpenGL设置:

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, 1, -1);
glMatrixMode(GL_MODELVIEW);

这是我的渲染代码:

glPushMatrix();
    Color.white.bind();

    texture.bind();


    glTranslatef(position.x+size.width/2, position.y+size.height/2, 0f);
    glRotatef(rotation, 0f, 0f, 1f);
    glTranslatef(-size.width/2, -size.height/2, 0f);

    glBegin(GL_QUADS);
        glTexCoord2f(0, 1);
        glVertex2f(0, 0);

        glTexCoord2f(1, 1);
        glVertex2f(size.width-1, 0);

        glTexCoord2f(1, 0);
        glVertex2f(size.width-1, size.height-1);

        glTexCoord2f(0, 0);
        glVertex2f(0, size.height-1);
    glEnd();

glPopMatrix();

我已经读过,如果对象大于纹理,OpenGL中的默认模式是重复纹理,但在我的情况下,这不是真的。

修改

加载纹理的代码(我使用了一个库(slick-util)):

texture = TextureLoader.getTexture(textureLocation.substring(0, textureLocation.lastIndexOf('.')), ResourceLoader.getResourceAsStream(textureLocation));

我在设置OpenGL后立即添加了纹理参数,这是正确的吗?

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, 1, -1);
glMatrixMode(GL_MODELVIEW);

GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

3 个答案:

答案 0 :(得分:1)

我的猜测是你正在使用地图集(或spritesheet),并且你的角色被其他精灵包围,导致这些边缘。为防止这种情况发生,您应该在UV坐标上添加一个微小的偏移量。通常四分之一像素将解决所有问题。通过这样做,您应该知道必须考虑纹理的总宽度和高度,因为UV值在范围(0,1)内。因此,将精灵中的所有紫外线抵消这个数量:

x-offset = 1.0 / (textureWidth * 4.0);
y-offset = 1.0 / (textureHeight * 4.0);

答案 1 :(得分:0)

回答Martijin上面的通知:这实际上不是地图集纹理,它足以检查glTexCoord2f,这表明完整的纹理被用作四边形。

此外,没有关于纹理类型的信息。它可能是jpg与一些工件,混合或着色器可以跳过一些纹理值留下瑕疵。

如果是,请尝试使用带有alpha通道的tga或png。

拉伸也可能导致瑕疵。你的glViewport和glOrth一样大吗?

答案 2 :(得分:-1)

您何时设置纹理参数?不知道它是否有帮助,但我倾向于使用以下(它的c,但是对java的翻译应该是直接的)。

glGenTextures(2, node->textures);
GRL2_BindTexture(GL_TEXTURE1, GL_TEXTURE_2D, node->textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
                GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
             128, 128, 0, GL_RGB,
             GL_UNSIGNED_BYTE, (GLvoid*) node->colorMap);

简而言之,我在创建和绑定纹理之后但在上传之前设置了纹理参数。不知道它是否会有所帮助,但可能会有所帮助。

要检查的另一件事是你的纹理大小。这是2的力量吗?有些图形卡可能比较贴心。