OpenGL的;重叠的Alpha透明粒子

时间:2013-12-08 07:47:50

标签: c opengl transparent libpng particles

我正在用C语言编写一个OpenGL程序,它实现了alpha透明的Bill Boarding粒子,它通过pnglib使用PNG(透明度)作为纹理。但是,我发现粒子的透明区域仍然会替换它前面的粒子。换句话说,新调用的粒子虽然在某些区域是透明的,但是完全重叠在它们之前调用的一些粒子,相反,之前称为粒子的粒子应该通过透明度显示。

为了可视化它所具有的效果,我附上一些图像来显示问题:

最初我调用从最老到最新的粒子:Front View

但是,当视图发生变化时,重叠效果显而易见:Back View

当我决定撤销通话顺序时,我得出相反的结论: Back View Order Reversed Front View Order Reversed

我认为解决这个问题的方法是将粒子从最远离相机调到最近。然而,遍历每个活动粒子,从最远到最近的顺序排序,然后每个显示帧调用每个粒子,计算量很大。我希望找到一个更简单,更有效的解决方案。我已经尝试过glBlendFunc(),但没有sfactordfactor似乎有效。

1 个答案:

答案 0 :(得分:5)

首先绘制所有非透明几何体。然后,在绘制粒子之前,通过调用glDepthMask (GL_FALSE)

禁用深度缓冲区写入

这将解决大多数渲染问题。

按照距相机的距离对粒子进行分类仍然是一个好主意。有了今天的CPU功率应该不是什么大问题。