关于绑定到Quad的Alpha混合/纹理的透明度:绑定到Quad的Alpha混合/纹理的透明度-Java Lwjgl Slick

Alpha blending / transperency of a texture bound to quad - java lwjgl slick

我需要有人帮助我。我真的无法弄清楚Alpha通道或混合的工作方式。图片为.bmp格式,可以完美加载。
但是我想要一种特定的颜色是透明的,在油漆中该颜色是R255xG0xB255。
我一直在寻找类似的主题,但是我发现或尝试过的所有东西似乎都弄乱了东西,例如给我一个全黑的屏幕或使所有东西都具有洋红色的感觉...
其他一切都可以在我的代码中正常工作...我应该切换到.png吗?能解决这个问题吗?如果我使用png或bmp,它有什么优点或缺点吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        // Initialization Code OpenGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, HEIGHT, WIDTH, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

    glClearColor(1.0f, 0.0f, 1.0f, 0.0f);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    while (!Display.isCloseRequested()) {
        // Render
        glClear(GL_COLOR_BUFFER_BIT);

        this.drawMapToScreen();
        this.drawCreatureToScreen();

        Display.update();
        Display.sync(60);
    }

    Display.destroy();
}

private void drawCreatureToScreen() {
    Texture tex3 = SpriteLoader.loadTexture("player");
    Color.magenta.bind();
    tex3.bind();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2i((HEIGHT-32)/2,(WIDTH-32)/2);
    glTexCoord2f(1, 0);    
    glVertex2i((HEIGHT-32)/2 +32,(WIDTH-32)/2);
    glTexCoord2f(1, 1);
    glVertex2i((HEIGHT-32)/2 +32,(WIDTH-32)/2 +32);
    glTexCoord2f(0, 1);
    glVertex2i((HEIGHT-32)/2,(WIDTH-32)/2 +32);
    glEnd();            

}

要做的是,当您的颜色为1.0f,0.0f,1.0f(在OpenGL的眼中:全红色,无绿色,全蓝色)时,alpha(透明度)通道为零,因此像素被绘制为完全透明。不幸的是,除非您使用着色器,否则无法在OpenGL中执行此操作,并且相信我使用着色器比我提出的解决方案更为混乱:在图像编辑器中执行"预乘alpha"。这意味着什么:它不取决于您使用哪种格式-.png或.bmp都可以,并且它们都支持alpha通道。 Alpha是透明的;在OpenGL中,您将要处理大量的float,因此在这里我将使用float。 Alpha是第四个颜色通道;我们有红色,绿色,蓝色,然后是Alpha。 Alpha通过与其他通道相乘来控制透明度(作为浮点数):如果alpha为0.0f,则该颜色是完全透明的,但是如果alpha为1.0f,则它是完全不透明的。总结:在编辑器中,必须确保要透明的区域在编辑器中是透明的。对于Alpha混合,仍然必须启用任何透明度:通常首选的混合模式如下:

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

现在,混合是一种使对象显得透明的技术。在您的情况下,您将需要使用上面的混合功能:使用glDisable(GL_BLEND)禁用启用混合后的混合。上面的blend函数本质上混合了先前存在的颜色和要渲染的颜色,使得渲染后的对象与另一个对象重叠,在另一个对象之后,看起来"顶部"和最近渲染的对象相对于"底部"是透明的目的。

TL; DR:

  • 确保要透明的区域在图像编辑器中是透明的。除非您使用不必要的复杂着色器,否则OpenGL无法使特定颜色的alpha值为0.0f。
  • 使用混合设置glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);启用混合。确保顶部对象在底部对象之后呈现。