如何制作自己的 z 缓冲区以正确混合 Alpha 通道?
那是不可能的。为了获得完美的与顺序无关的透明度,您必须摆脱 z-buffer 并用另一种机制替换它以去除隐藏表面。
使用 z-buffer 有两种可能的方法来解决这个问题。
- 多层 z 缓冲区(硬件加速不切实际) - 基本上它将存储几层“深度”值并将其用于混合透明表面。会占用大量内存,并且将有最大数量的透明叠加表面,一旦超过限制,就会出现伪影。
- 深度剥离(谷歌它)。订购独立透明度,但每个像素的“重叠”透明多边形的最大数量有限制。实际上可以在硬件上实现。
两种方法都有一个限制(每个像素重叠透明多边形的最大数量),一旦超过限制,场景将不再正确渲染。这意味着整个事情毫无用处。
您实际上可以做的(以获得完美的解决方案)是完全删除 zbuffer,并制作一个图形渲染管道,该管道将收集所有要渲染的多边形,剪辑它们,分割它们(当两个多边形相交时),对它们进行排序然后绘制它们以正确的顺序显示在屏幕上,以确保您获得正确的结果。但是,这很难,而且使用硬件加速更难。我认为(我不完全确定它是否发生过)5 或 6 年前,一些 ATI GPU 相关文档提到,他们的一些卡可以通过启用某种扩展来渲染正确的场景,同时禁用 Z-Buffer。然而,他们没有说关于阿尔法混合的事情。从那以后我就再也没有听说过这个功能。也许它没有流行起来并与 TruForm 一样(被遗忘)。