重叠的3d粒子在相同的z处不能很好地混合

我正在研究一个3d粒子发射器。 这很不错,但我仍然有三角形sorting问题。

粒子重叠1粒子重叠2

正如你在照片中看到的那样,有一些颗粒没有被正确地混合,大概是因为sorting。 我把我的四边形放在前面。 他们都被绘制在一个单一的glDrawElements(GL_TRIANGLES...调用。

混合处于打开状态并打开深度缓冲区。 深度缓冲区必须打开,因为场景中的其他3d对象有时在前面,有时在粒子的后面。

当他们在az空间中移动时,他们sorting得更好,而且看不到它:

更好的粒子重叠

我正在使用以下比较sorting:

 int compare (const void *a, const void *b) { Particle *ia = (Particle*)a; Particle *ib = (Particle*)b; float t = ib->distanceToCamera - ia->distanceToCamera; if (t<0) { return -1; } return (t>0); 

}

但是我认为有些时候某些粒子具有相同的z,然后它们不能很好地混合。

一个想法是以某种方式迫使他们不一样z。 但是随着他们自己动手,我不确定。

问题 – 如果重叠的三角形在z空间中接近但不相等,并且在绘图命令内仍然回到前面,它们是否仍然会像这样重叠?

答案 – 我设置了一个断点,并打印出所有的结构,发现在同一个z中有大量的四边形。 在团队中。

使用从检查的答案的建议,我能够修复它。 通过确保首先渲染实体,粒子保持最后,我不需要担心在渲染粒子的同时写入深度缓冲区。 在我的比赛中,他们都像气体,烟雾和空气。 所以他们都需要相互融合,并且相互融合。 当我开始渲染我设置的粒子:

 glDepthFunc(GL_LEQUAL); glDepthMask(GL_FALSE); 

当我完成渲染后,我将它返回到:

 glDepthFunc(GL_LESS); glDepthMask(GL_TRUE); 

并看看结果:

适当的混合

我相信发生的事情是,如果粒子三角形在相同的平面上,他们正在写入深度缓冲区,然后如果更大的Z上的下一个会被掩盖,那么绘制粒子三角形。 通过closures深度遮罩,它不会写入遮罩,因为它正在绘制粒子,所以它们不会再掩盖对方。 由于我最后画了他们,他们不需要掩盖其他的东西。

更新:我刚刚发现的另一个好处。 现在我根本不需要对粒子进行分类。 sorting只是为了使他们正确绘制深度testing。 这不再需要。 所以我也有这个节省。

Solutions Collecting From Web of "重叠的3d粒子在相同的z处不能很好地混合"

绘制alpha多边形时的一般经验法则是:

1 – 首先绘制所有固体多边形。

2 – 如果可以,请重新排列。 这样做的主要原因是确保混合方程所产生的最终颜色是一致的框架。 除非是引擎提供的东西,否则我通常不会为这一步而烦恼,而且我可以亲眼看看额外的成本。

我不认为这是在这个特殊情况下解决问题的方法,因为看上去你的多边形是相互交叉的,在这种情况下,实际上没有完美的方法来对它们进行sorting。在一个像素着色器或使用一些其他顺序独立的透明度技术(但通常是巨大的矫枉过正)。

3 – 将ztest的渲染器设置为less于等于或小于

4 – 不要通过将zwriteenable renderstate设置为false来写入z缓冲区

我怀疑这是你失踪的最后一步。 您提到需要打开z缓冲区,以便alpha多边形不会与实体错误sorting,但并不那么简单。

您可以控制从z缓冲区读取和写入z缓冲区,在这种情况下,您需要读取z进行ztesting,以便您的sP正确地与z缓冲区的现有内容进行sorting; 但你不想写。 不写入z缓冲区将导致下一个alpha poly基本上忽略前一个,你应该看到接缝消失。

这种方法的不足之处在于颜色混合方程现在对于某些片段产生稍微不正确的结果,这取决于具体的情况,但是对此没有直接的解决scheme,通常结果是足够好的。