我一直在尝试在LWJGL中绘制透明纹理。但是,我的代码似乎不起作用。每当我运行代码时,都会出现透明图像,但背景完全是黑色。
这就是我所说的完全黑色,但图像很好:
我已经能够绘制不透明的纹理,但到目前为止,我没有正确地绘制这个纹理。
我想知道此代码中缺少/不正确的内容。
绘制纹理代码:
//draw transparent texture
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glPushMatrix();
GL11.glColor4d(1,1,1,1);
texture.bind();
GL11.glTranslated(0.5,0.5,0.0);
GL11.glRotated(270-this.getAngle(),0.0,0.0,1.0);
GL11.glTranslated(-0.5,-0.5,0.0);
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0,0);
GL11.glVertex2d(this.getX(), this.getY());
GL11.glTexCoord2f(1,0);
GL11.glVertex2d(this.getX(),(this.getY()+this.getHeight()));
GL11.glTexCoord2f(1,1);
GL11.glVertex2d((this.getX()+this.getWidth()),(this.getY()+this.getHeight()));
GL11.glTexCoord2f(0,1);
GL11.glVertex2d((this.getX()+this.getWidth()), this.getY());
}
GL11.glEnd();
GL11.glPopMatrix();
GL11.glDisable(GL11.GL_BLEND);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
以下是从文件中加载纹理的代码:
private Texture loadTexture(String key){
try {
//in this case, key refers to a valid power of 2, transparent png
return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/"+key+".png")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
答案 0 :(得分:2)
你只需要添加:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
你的init函数中的:)
答案 1 :(得分:1)
上面的代码似乎没有问题。通过使用Slick-Util Library - Part 1 - Loading Images for LWJGL中的简单代码并将render()
方法替换为您的代码,我可以使用此向上箭头的RGBA图像正确地查看透明度:
请确保您使用黑色以外的颜色清除颜色缓冲,即使用
GL11.glClearColor(0.7f, 0.7f, 0.7f, 1.0f); // try with red (1, 0, 0, 1) green (0, 1, 0, 1) to check the image's transparent area.
如果这不适用于您的情况,请发布一个完整的可运行示例,因为问题必须出在代码的其余部分。