0

我一直在尝试在 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;
}
4

2 回答 2

3

你只需要添加这个:

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

在你的初始化函数中:)

于 2015-07-19T01:32:44.810 回答
1

上面的代码似乎没有问题。通过使用Slick-Util 库中的简单代码 - 第 1 部分 - 为 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.

如果这对您的情况不起作用,请发布一个完整的可运行示例,因为问题必须出在您的代码的其余部分。

于 2013-08-18T08:20:31.870 回答