使用png纹理时使用opengl(通过lwjgl)混合问题

时间:2013-03-17 17:16:38

标签: java opengl lwjgl alphablending

在OpenGL中使用混合时,我有一个(希望)小问题。 目前我使用LWJGL和Slick-Util来加载纹理。 纹理本身是一个2048x2048 png图形,我在其中存储大小为128x128的图块,因此每行/每列有16个精灵。 由于glTexCoord2f()使用标准化坐标,我写了一个小函数来缩放整个图像,只显示我想要的精灵。 它看起来像这样:

private Rectangle4d getTexCoord(int x, int y) {
    double row = 0, col = 0;
    if(x > 0)
        row = x/16d;
    if(y > 0)
        col = y/16d;

    return new Rectangle4d(row, col, 1d/16d, 1d/16d);
}

(Rectangle4d只是一种将x,y,width和height存储为双重坐标的类型)

现在的问题是,一旦我使用这些坐标,精灵正确显示,透明度也能正常工作,其他一切都变得非常暗(更正确的是它变得透明,我猜,但是因为ClearColor是黑色的)。然而,精灵本身是正确绘制的。我已经尝试将所有glColor3d(..)更改为glColor4d(..)并将alpha设置为1d,但这并没有改变任何东西。精灵是目前唯一的图像,其他一切都只是彩色四边形。

以下是我初始化OpenGL的方法:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

以下是我加载精灵的方法(使用slick-util):

texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/sprites.png"));

最后我像这样渲染它(使用顶部提到的辅助函数getTexCoord()):

    texture.bind();
    glColor4d(1, 1, 1, 1);
    glBegin(GL_QUADS);
    {
        Rectangle4d texCoord = getTexCoord(0, 0);
        glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY());
        glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY());
        glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT-PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX()+(float)texCoord.getWidth(), (float)texCoord.getY()+(float)texCoord.getHeight());
        glVertex2i((Game.WIDTH+PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);

        glTexCoord2f((float)texCoord.getX(), (float)texCoord.getY()+(float)texCoord.getHeight());
        glVertex2i((Game.WIDTH-PLAYERSIZE)/2, (Game.HEIGHT+PLAYERSIZE)/2);
    }
    glEnd();

结果就是这样(精灵正确绘制,其他一切都更暗/透明): How it looks after assigning the Texture to the quad 没有纹理(只是一个灰色的四边形),它看起来像这样(现在一切都正确绘制,除了我没有精灵): How it looks without assigning a texture to the quad

感谢所有想要阅读此内容的人!


修改

我试图找到问题的其他一些信息: 这是我将ClearColor设置为白色时的外观(使用glClearColor(1,1,1,1)): Setting ClearColor to white

我尝试的另一件事是在我绘制播放器之前启用混合,并在完成绘制后立即再次禁用它: this happens while only using blending when drawing the player (blackclear)

现在好一点,但它仍然明显更暗。在这种情况下,它看起来确实是“更暗”而不是“更透明”,因为当我使用白色作为清晰颜色(同时仍然只在需要时启用混合并且在其后立即禁用它)时它是相同的,如下所示: this happens while only using blending when drawing the player (whiteclear)

1 个答案:

答案 0 :(得分:1)

我阅读了一些相关问题并最终找到了解决方案(Link)。当我想要渲染无纹理对象(在这种情况下为彩色四边形)时,我不能/不应该一直启用GL_TEXTURE_2D!

所以现在,我只在渲染精灵之前启用它,然后在绘制精灵后再次禁用它。它现在完美运作! :)