在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();
结果就是这样(精灵正确绘制,其他一切都更暗/透明): 没有纹理(只是一个灰色的四边形),它看起来像这样(现在一切都正确绘制,除了我没有精灵):
感谢所有想要阅读此内容的人!
修改:
我试图找到问题的其他一些信息: 这是我将ClearColor设置为白色时的外观(使用glClearColor(1,1,1,1)):
我尝试的另一件事是在我绘制播放器之前启用混合,并在完成绘制后立即再次禁用它:
现在好一点,但它仍然明显更暗。在这种情况下,它看起来确实是“更暗”而不是“更透明”,因为当我使用白色作为清晰颜色(同时仍然只在需要时启用混合并且在其后立即禁用它)时它是相同的,如下所示:
答案 0 :(得分:1)
我阅读了一些相关问题并最终找到了解决方案(Link)。当我想要渲染无纹理对象(在这种情况下为彩色四边形)时,我不能/不应该一直启用GL_TEXTURE_2D!
所以现在,我只在渲染精灵之前启用它,然后在绘制精灵后再次禁用它。它现在完美运作! :)