【问题标题】:OpenGL Alpha blending and object independent transparencyOpenGL Alpha 混合和与对象无关的透明度
【发布时间】:2013-05-27 13:30:31
【问题描述】:

我正在尝试使用以下幼稚技术来实现对象无关透明度 (OIT):

  1. 对不透明和透明对象进行排序。

  2. 使用深度写入渲染不透明。

  3. 禁用深度写入,启用 Alpha 混合并渲染透明对象。

如果我只有完全不透明和透明的对象,它可以正常工作。但是,如果某些对象具有透明的 alpha 纹理(我的所有网格都是平面的)并且需要 Alpha 混合,而其他对象是透明的,那该怎么办?例程是什么在这种情况下? 目前,如果我首先渲染透明并打开深度写入和 alpha 混合,然后渲染具有 alpha 通道纹理的对象(深度注销,混合)会发生什么是最后一个渲染平面的部分与第一个相交飞机被淘汰。这是一张描述我所追求的图片:

两个平面都具有一定的透明度,并且仍然保持深度排序。 我知道我可以对 OIT 使用更复杂的方法,例如 this。但是是否可以在不进入片段链接列表等的情况下做到这一点?

【问题讨论】:

  • 您是在问是否可以便宜且简单地进行 OIT?因为答案是否定的。
  • 我在问我是否可以在不进行深度剥离和其他分层片段缓冲技术的情况下获得图片中的结果。

标签: opengl


【解决方案1】:

基于光栅化的渲染器,就其本质而言,不能很好地处理透明度。光栅化器通过渲染一个对象,然后渲染另一个来工作。它不知道之前渲染了什么或之后渲染了什么。它的工作是获取一个 3D 形状并将其变成一个颜色域。

如果有一种简单的技术可以实现与订单无关的透明度,那么您现在应该已经听说了,因为每个人都会使用它。没有。每种通用的 OIT 技术都很复杂,并且有一些与之相关的性能缺点。

是否有可能为两个平面相交而屏幕上没有其他内容的非常特定情况找到一种方法?是的。您能否将该方法推广到具有任意透明度的任意场景?没有。

【讨论】:

  • 您能否指出最有效的 OIT 技术(就性能而言)?
  • @MichaelIV:首先,这是一个完全独立的问题。其次,这不是一个真正可以回答的问题。这将取决于您的场景复杂性和您的硬件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2015-07-03
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多