我正在用c#编写一款游戏,使用opengl即时模式渲染。很多时候,透明多边形由于排序不正确而不能正确显示。我已经搜索了很多,但找不到关于如何快速进行深度排序的教程。我的尝试方法是使用List从相机计算每个透明三角形的深度。排序,但速度非常慢(秒/帧,而不是帧/秒)
是否有一个标准的方法来做深度排序?有没有很好的c#教程教你如何做到这一点?有什么快速的方法吗?
与顺序无关的半透明多边形渲染可能是在通用方式中获得正确的最痛苦的效果之一。这就是为什么人们在速度和质量之间使用不同的技巧。最简单的方法是简单地渲染几何体在两个通道:
- 渲染所有不透明的几何图形
- 禁用深度写入
GL.DepthMask(false)
并渲染半透明几何。
这样,你的半透明多边形将针对不透明多边形进行深度测试,但不会修改深度缓冲(即它们不会针对其他半透明多边形进行深度测试)
这简单,快速,避免了对多边形进行排序的必要性。缺点是它只适用于使用加法或乘法混合(所谓的"交换"混合模式)的半透明效果。对于其他混合效果,您要么必须对半透明多边形进行排序,要么使用深度剥离等技术。
引用:
- http://www.openglsuperbible.com/2013/08/20/is-order-independent-transparency-really-necessary/
- https://gamedev.stackexchange.com/questions/43635/what-is-the-order-less-rendering-technique-that-allows-partial-transparency
- https://developer.nvidia.com/content/interactive-order-independent-transparency
- http://developer.download.nvidia.com/SDK/10/opengl/src/dual_depth_peeling/doc/DualDepthPeeling.pdf