【问题标题】:Order of translucent object rendering半透明对象渲染的顺序
【发布时间】:2018-03-16 08:22:54
【问题描述】:

在渲染半透明对象时(使用glBlend),建议将对象从后到前z顺序排序。

来自opengl docs: 在应用程序中使用深度缓冲时,您需要注意渲染图元的顺序。需要首先渲染完全不透明的图元,然后以从后到前的顺序渲染部分不透明的图元。如果您不按此顺序渲染图元,则通过部分不透明的图元可以看到的图元可能会完全失去深度测试。

所以,每当我在渲染不透明三角形后渲染半透明对象时,如果我相对于“视图方向”从后到前渲染半透明三角形,这是否正确? back to front 到底是什么意思?我想了解,如果我有一个经过 mvp 转换的场景对象,我是否需要专门查看世界坐标​​中的顺序以及与相机中心的关系?

此外,这是否会根据混合类型而改变?

【问题讨论】:

标签: opengl graphics 3d


【解决方案1】:

无论何时渲染半透明三角形,都必须从后向前绘制。此处从后到前的意思是,您必须先绘制远离屏幕的三角形(具有更高的深度值)。

之所以需要这样做,是因为大多数混合方程会根据顺序产生不同的结果。在 OpenGL 中实现的方程通常使得它们在从后到前渲染时给出“正确”的结果。

【讨论】:

  • 您能否更深入地了解从后到前相对于屏幕的含义?具体来说,就相机中心和世界坐标而言。大多数解释中都缺少一些细节。
  • 定义为:从较高的深度值到较低的深度值。在世界坐标中,这意味着您必须首先绘制远离相机中心的对象。
  • @dev_nut 这意味着您需要首先在相机空间(而不是在世界空间)中渲染最远的面。对于相交的(半)透明多边形来说,这不是一件容易的事。
  • @Spektre 如果多边形相交,那么您需要在相交处细分它们。我猜如果几何体是静态的,这不是问题,因为可以在渲染之前进行细分,但如果是动态网格,那将需要一些非常好的多边形处理逻辑。
  • @dev_nut 是的,确实有一些解决方法,但是请参阅我在您的问题下方的评论中链接的 QA 中的答案。此外,如果您知道只有几层透明度,您可以记住运行时渲染的几个深度层(深度排序片段而不是多边形)并在最后组合(但这真的很难在 GPU 上实现)。如果您不想求助于ray tracing,我认为在这种情况下,答案之一中的 nVidia 论文是您的最佳选择。
【解决方案2】:

我认为顺序很重要,不仅因为你的混合功能 正在使用但您必须牢记管道的一个重要方面。 z 测试发生在管道中的混合操作之前。 考虑我们正在绘制两个三角形 t1 和 t2 t1 在 t2 后面的场景。

因此,如果 z 测试拒绝属于 t1 的所有片段,则 t1 的颜色值不会写入颜色缓冲区。现在稍后正在绘制 t2 片段,它正好在 t1 前面,z 测试在最后一步拒绝了该片段。所以理想情况下,t1 的颜色会与 t2 的颜色混合,但由于 t1 的 z 测试失败并且混合操作在 z 测试之后,t2 的颜色不会被混合。

因此,如果您不遵守秩序,请禁用 z 测试,然后使用适当的混合功能绘制您的对象。这在性能上不太好,因为很多 z 测试都会失败。

所以你保持秩序或多边形,但这个解决方案也不会随着多边形数量的增加以及不透明和透明对象的混合而扩展。

因此提出了使用与订单无关的透明度的新解决方案。 有不同的方法来实现这一点,您不必担心对象的顺序。

我已经在片段着色器中使用每像素链表实现了解决方案。您可以在下面找到链接。这不是最好的解决方案,但应该给你一个公平的想法。

Order Independent Transparency

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 2014-08-07
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多