OpenGL:在白色背景下实现相同的透明度

时间:2014-09-10 21:55:08

标签: opengl transparency blending

我有一个OpenGL应用程序,它显示一个透明的管道和一些穿过它的彩色液体。

图片显示左侧管道为空,右侧为满管。

Transparent pipe

当我将背景更改为白色时,透明管道消失(我猜它也会变成白色,因为混合)。

我使用以下GL代码:

gl.glColor4d( 240, 240, 240, 0.1); // transparent color
gl.glEnable( gl.GL_BLEND );
gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE );
glu.gluCylinder( quadObj, width, width, length, 32, 1 );

如何调整混合功能(和/或颜色,如果需要)以达到与白色背景相同的效果?

1 个答案:

答案 0 :(得分:3)

我建议glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

顺便说一句。进入glColor…{f,d}的值被剪切到范围[0,1]。我建议你为外管尝试一些浅灰色,即glColor4f(0.75, 0.75, 0.75, 0.1)

另请注意,OpenGL透明度与订单无关。面部必须从前面排序以便混合才能正常工作(如果您看到图片中圆柱体的远端,您可以看到,它会错过背面,这可能是因为它最后被绘制,但之后已被气缸的其余部分遮挡。

更新:透明度顺序问题有一个简单的解决方法:在启用了面部剔除的情况下绘制两次圆柱体。在第一步绘制正面被剔除,然后第二次绘制背面被剔除:

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
gluCylinder( quadObj, width, width, length, 32, 1 );
glCullFace(GL_BACK);
gluCylinder( quadObj, width, width, length, 32, 1 );
glDisable(GL_CULL_FACE);