可以创建不叠加alpha值的透明度着色器

在这里输入图像描述

上面的图片展示了我想要达到的目标。 这是一个透明的对象着色器,​​但是与这个着色器交叉的对象不在一起,而是简单地合并相同数量的透明度。

这似乎是一个简单的事情,但我不知道是否甚至可以从我了解着色器管道的工作原理。 从我所了解的过程(如果我错了,请纠正我),每个独立的对象创建一个片段。 一旦创建了每个对象的所有片段,深度缓冲区就会一次select要在帧缓冲区中写入该像素的片段,并将它们叠加在一起。 一旦它们全部被添加到帧缓冲器,最终的结果就成为像素。

如果我可以访问各个片段,然后在将它们写入(“分层”)到帧缓冲区之前进行比较,那么这将是一个简单的跟踪它们的情况,并丢弃在同一像素空间中的任何额外片段这个着色器/渲染队列。 但我不认为这是可能的OpenGL?

有没有另外一种方法可以达到同样的效果?

一个这样做的方法是使用min混合。 使用Unity,可以使用BlendOp命令在ShaderLab中设置。

如果您的对象全部是单色的,您可以简单地直接在渲染对象上使用最小混合,并避免使用Alpha通道。 (使用最小混合时,白色是透明的。)最小混合对颜色也起作用,但是它将单独占用每个RGB通道的最小值,这可能会导致一些奇怪的效果(例如品红色和黄色的最小值为红色)。

我会去给你的对象的z顺序,和

  1. 绘制所有不透明的对象
  2. 先绘制较近的透明物体。

使用这个顺序,z深度testing将防止合并。