OpenGL Alpha混合和物体独立透明

5

我正在尝试实现对象无关的透明度(OIT),使用以下简单的技术:

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

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

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

如果我只有完全不透明和透明的对象,它可以正常工作。但是如果既有具有半透明 Alpha 纹理(所有网格都是平面)且需要启用 Alpha 混合的对象,也有其他透明度的对象怎么办?在这种情况下应该怎么处理? 目前,如果我首先使用深度写入和 Alpha 混合来渲染透明部分,然后使用带 Alpha 通道纹理的对象(深度写入关闭,混合打开)进行渲染,则会剪切与第一个平面相交的最后渲染平面的一部分。这里有一张图片来说明我的目标:

enter image description here

这两个平面都具有一定程度的透明度,并仍然保持深度排序。 我知道可以使用更复杂的方法来实现 OIT,例如此链接中介绍的使用片段链接列表等技术。但是是否可能在不使用片段链接列表等技术的情况下完成呢?


你是在问是否可以便宜简单地进行OIT吗?因为答案是否定的。 - Nicol Bolas
我想问一下,是否可以在不使用深度剥离和其他分层片段缓冲区技术的情况下获得如图片中所示的结果。 - Michael IV
1个回答

3
一种基于光栅化的渲染器本质上无法很好地处理透明度。光栅化器通过渲染一个对象,然后再渲染另一个对象来工作。它不知道之前已经渲染了什么或者之后将要渲染什么。它的任务是将3D形状转换为颜色区域。
如果有一种简单的技术可以实现无序透明度,那么你现在早就听说过了,因为每个人都会使用它。但事实上并没有这样的技术。每个通用的OIT技术都很复杂,并且都有一些与其相关的性能缺陷。
对于屏幕上没有其他物体干扰的两个平面相交的非常特殊的情况,是否可能找到一种方法?是的。但是,你不能将该方法推广到任意场景和任意透明度。

你能指出最有效的OIT技术吗(就性能而言)? - Michael IV
@MichaelIV:首先,那是完全不同的问题。其次,这并不是一个可以回答的问题;它将取决于您的场景复杂性和硬件。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接