opengl / lwjgl的透明度问题

时间:2014-03-12 22:01:42

标签: java opengl lwjgl

我正在尝试将两个纹理绘制到包含透明度的3D空间。当它们不重叠时,它们可以正常工作:

enter image description here

然而,当一个纹理与另一个纹理重叠时,透明度意味着您可以看到后面的纹理:

enter image description here

初始化混合时,我使用GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA

2 个答案:

答案 0 :(得分:1)

您需要深度排序或使用alpha测试:

glEnable(GL_ALPHA_TEST);
glAlphaTest(GL_GREATER, 0.0f);

只会绘制alpha值大于0f的像素。但是,这不适用于混合透明像素。 Andon的解决方案是我使用的解决方案,虽然我在2D工作,但我必须具有烟雾效果的透明度。

答案 1 :(得分:1)

一种可能性是在片段着色器中使用discard关键字,因为alpha测试不再适用于我们。这样做的缺点是具有对象的别名边缘。

另一种可能性是对对象进行深度排序并向后绘制。显而易见的缺点是必须首先执行转换和排序。如果可以静态地确定对象的顺序(当相机没有太大变化时),有时可以避免这种情况。另一个缺点是用不同的东西过度绘制阴影像素,从而丢掉了性能。

最后,您可以使用alpha-to-coverage,其中使用反相关硬件来处理透明度。这不需要排序并使对象的边缘平滑。缺点是每个渲染上下文都启用了这个功能,并且可能无法在任何地方使用。