Java 使用png纹理时使用opengl(通过lwjgl)的混合问题
在OpenGL中使用混合时,我(希望)遇到了一个小问题。 目前我使用LWJGL和Slick Util加载纹理。 纹理本身是一个2048x2048 png图形,我在其中存储大小为128x128的瓷砖,因此每行/每列有16个精灵。 因为glTexCoord2f()使用标准化坐标,所以我编写了一个小函数来缩放整个图像,以便只显示我想要的精灵。 看起来是这样的:Java 使用png纹理时使用opengl(通过lwjgl)的混合问题,java,opengl,lwjgl,alphablending,Java,Opengl,Lwjgl,Alphablending,在OpenGL中使用混合时,我(希望)遇到了一个小问题。 目前我使用LWJGL和Slick Util加载纹理。 纹理本身是一个2048x2048 png图形,我在其中存储大小为128x128的瓷砖,因此每行/每列有16个精灵。 因为glTexCoord2f()使用标准化坐标,所以我编写了一个小函数来缩放整个图像,以便只显示我想要的精灵。 看起来是这样的: private Rectangle4d getTexCoord(int x, int y) { double row = 0, col
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);
}
(矩形4D只是一种将x、y、宽度和高度存储为双坐标的类型)
现在的问题是,一旦我使用这些坐标,精灵就会正确显示,透明度也会正确工作,只是其他东西会变得更暗(我想它会变得更正确,但因为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);
下面是我如何加载sprite(使用slick util):
最后,我将其呈现为这样(使用顶部提到的帮助函数getTexCoord()):
结果是这样的(精灵绘制正确,其他颜色都较暗/透明):
如果没有纹理(只有一个灰色四边形),它看起来是这样的(现在所有的东西都正确绘制了,除了我没有精灵):
感谢所有费心阅读此文的人
编辑: 从我查找问题的尝试中获得的一些其他信息: 这是我将ClearColor设置为白色时的外观(使用glClearColor(1,1,1,1)): 我尝试的另一件事是在我绘制播放器之前启用混合,并在我完成绘制后再次禁用它: 现在好一点了,但是颜色还是很暗。在这种情况下,它似乎真的“更暗”而不是“更透明”,因为我使用白色作为清晰颜色时,它是相同的(同时仍然只在需要时启用混合,并在需要后立即禁用),如下所示:
我读了一些相关的问题,最终找到了解决方案()。显然,当我想要渲染无纹理对象(本例中为彩色四边形)时,我不能/不应该一直启用GL_TEXTURE_2D
所以现在,我只在渲染精灵之前启用它,然后在绘制精灵后再次禁用它。它现在工作得很好!:) 这是一个有趣的结果。如果禁用混合,会发生什么?整个屏幕都变黑了吗?当我禁用混合时,所有东西都正确绘制,除了精灵中原本不可见的部分是白色。好吧,你把我难住了。如果尝试注释掉代码的其他绘图部分,会发生什么情况?如果你把透明的颜色改成白色而不是黑色,会发生什么呢?谢谢你的评论,我在开场白中添加了更多的细节和屏幕。
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/sprites.png"));
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();