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); |
现在,混合是一种使对象显得透明的技术。在您的情况下,您将需要使用上面的混合功能:使用
TL; DR:
- 确保要透明的区域在图像编辑器中是透明的。除非您使用不必要的复杂着色器,否则OpenGL无法使特定颜色的alpha值为0.0f。
-
使用混合设置
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 启用混合。确保顶部对象在底部对象之后呈现。