2014-03-12 73 views
1

我试图绘制两个纹理到包含透明度的三维空间。当他们不重叠,它们很好地工作:透明度与opengl/lwjgl问题

enter image description here

然而,当一个纹理重叠其他的透明度意味着你可以通过后面的一见:

enter image description here

我用GL_SRC_ALPHA和初始化混合时的GL_ONE_MINUS_SRC_ALPHA

+0

确保你有glEnable(GL_BLEND); – Balk

+1

@Balk我不认为你理解这个问题:P – Ryxuma

+4

你需要从背对背对你的半透明精灵进行深度排序。不透明物体应该先被绘制,理想情况下它们将被前后拖拽(但是深度缓冲区可以有效地用于这个目的,并且您不需要***来对不透明物体进行分类)。如果您先前绘制不透明的对象(它有助于深度缓冲区优化技术),您通常会获得更好的性能,但不值得花时间手动对它们进行排序。对于半透明的物体,你别无选择 - 要进行适当的混合,你绝对必须对它们进行分类。 –

回答

1

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

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

这只会得出具有比0F更多的阿尔法值的像素。但是,这对混合透明像素不起作用。 Andon的解决方案就是我使用的解决方案,尽管我使用2D工作,并且必须具有烟雾效果的透明度。

1

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

另一种可能性是对对象进行深度排序并回到前面。明显的缺点是必须首先执行转换和排序。如果可以静态确定物体的顺序(当相机变化不大时),这有时可以避免。另一个缺点是通过不同的东西对阴影像素进行透视,从而导致性能下降。

最后,您可以使用alpha-to-coverage,其中antialiassing硬件用于照顾透明度。这不需要排序并使对象的边缘平滑。缺点是每个渲染上下文都可以启用,并且可能无处不在。