在复杂场景中渲染半透明对象

Posted

技术标签:

【中文标题】在复杂场景中渲染半透明对象【英文标题】:Rendering translucent objects in a complex scene 【发布时间】:2013-04-05 10:43:38 【问题描述】:

所以我遇到以下关于场景图和半透明对象的问题......我的问题是我想在一个场景中渲染多个半透明对象。我知道我必须先渲染不透明的物体,然后从后到前渲染半透明的物体。效果很好……或多或少……

但真正的问题是,例如,我有一个半透明的立方体,白色(或任何其他颜色),alpha 值例如为 0.5。立方体的内部结构在波前 obj 文件中给出,因此给出了立方体单平面的顺序。我不订购对象的单个平面,因为在具有> 1000 个对象和每个对象的> 1000 个顶点的场景中这会太多,所以我只订购整个对象。如果我渲染对象的单个平面并四处移动,那么就会有这样一个时刻,一个比另一个更近的平面在另一个平面之前被渲染。然后第二个没有被渲染,因为深度缓冲区不允许这样做,这是渲染中的错误。

关闭深度缓冲区不是解决方案:我需要它,因为可能存在半透明和不透明的复杂对象。

任何提示我可以如何实现对象,即使它们很复杂并且既不透明又半透明,以正确的方式呈现?

【问题讨论】:

【参考方案1】:

基本上你必须做到以下几点:

将所有东西分成不透明和半透明(如果一个对象由两者组成,则必须将其撕开)

清除深度缓冲区

启用深度测试并绘制不透明的所有内容。

将深度缓冲区设为只读:glDepthMask(GL_FALSE)

将所有半透明的东西都画在前面。

这应该可以解决问题。

【讨论】:

好的,但问题是,“从后到前”意味着我必须订购它。由于上述情况,此排序必须在每个三角形上。但这可能太多了。有什么办法,用着色器做吗? 不,它不能用着色器完成,因为它独立处理三角形。准确地渲染半透明物体是很难做到的。即使您对每个三角形进行排序,也可能由于三角形相交等而出现错误。您不能忍受在对象级别排序时所犯的错误吗?您必须在此处找到速度和准确性之间的折衷方案。

以上是关于在复杂场景中渲染半透明对象的主要内容,如果未能解决你的问题,请参考以下文章

渲染半透明/透明叠加

在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]

在 OpenGL 中渲染一个*填充的*半透明立方体

如何在 Xcode 中渲染具有半透明纹理的 3D 模型?

向导航栏添加半透明工具栏会导致 iOS 7 中出现渲染问题

易语言如何在画板中添加一个半透明的图片