2013-04-05 129 views
1

因此,我对以下关于场景图和半透明物体的问题感到困惑......我的问题是我想在一个场景中渲染多个半透明物体。我知道我必须首先渲染不透明物体,然后从后到前渲染半透明。这是行之有效的......或多或少...渲染复杂场景中的半透明物体

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

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

任何提示我如何才能实现对象,即使它们很复杂,既透明又透明,是以正确的方式呈现的?

回答

3

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

  • 独立的一切都变成不透明和半透明(如果一个对象既包括你要APPART撕毁它)

  • 清除深度缓冲

  • 启用深度测试并绘制一切不透明。

  • 化妆深度缓冲只读:glDepthMask(GL_FALSE)

  • 借鉴一切半透明后到前。

这应该做的伎俩。

+0

好的,但问题是,“回到前面”意味着我必须订购它。由于上述情况,此顺序必须位于每个三角形上。但这可能太多了。有没有什么办法,用着色器做? – user2248673 2013-04-05 12:04:18

+0

不,它不能用着色器完成,因为它独立处理三角形。准确渲染半透明物体很难做到。即使您对每个三角形进行排序,由于相交三角形等原因也可能出现错误。你不能忍受在对象级别排序时所犯的错误吗?你必须在这里找到速度和准确度之间的折中。 – Dirk 2013-04-05 12:26:31