如果它是与顺序无关的透明胶片,那么基本问题是深度缓冲区存储每个像素的深度,但如果您正在编写部分透明几何的视图,那么不止一个片段对每个像素都有贡献。
如果您要稳健地解决问题,则需要每个像素有序的深度列表,然后回到最近的不透明片段。然后你会按照相反的顺序走这个列表。在实践中,OpenGL不会像可变大小的数组那样做事情,所以人们通过按照先后顺序绘制它们的几何图形来达到非常好的效果。
GL_SAMPLE_ALPHA_TO_COVERAGE
的一个替代方案是切换到屏幕门透明度,无论是以非常高的分辨率还是采用多重采样,都无法区分真正的透明度。理想情况下,你会这样做,但这会使OpenGL重复性规则失效。尽管如此,因为你在GLSL,你可以自己做。您的采样器只需输入alpha,并将其用作输出最终像素的概率。因此,从某个地方抓住一个范围在0.0到1.0之间的随机值,如果它大于alpha,则丢弃该像素。始终以1.0的alpha值输出,并使用正常的深度缓冲区。 Answers like this对你可以做些什么来获得GLSL中的随机数字有了更多的了解,显然你想尽可能多地进行多重采样。
Eric Enderton写了a decent paper(其中有slide version)关于随机顺序无关的透明度,并附带一个值得检查的DirectX实现。
“正确混合alpha通道”是什么意思?你想解决什么问题?你是否想要做一些与订单无关的事情? – 2012-03-23 20:27:11
除了Nicol Bolas所说的内容:对于与订单无关的透明度,一些额外的深度缓冲区是不够的。什么可以分层分解场景,这就是所谓的深度剥离。但是,这不是微不足道的。 – datenwolf 2012-03-23 20:36:20
@NicolBolas,是的。如果我可以从glsl读取Z-Buffer,那么我有一个简单的方法来做到这一点! – 2012-03-24 07:27:17