图形 - 在缓冲区之间混合,而不考虑首先呈现哪个缓冲区



我正在使用以下内容启用混合:

self.pipelineDescriptor.colorAttachments[0].blendingEnabled = true
self.pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactor.SourceAlpha
self.pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactor.OneMinusSourceAlpha
我渲染缓冲区

A,然后渲染缓冲区 B。它们中的每一个都可以有透明对象。问题是渲染的顺序很重要 - 透明度只会在一个方向上起作用,因此如果我首先渲染 A 并且 A 有透明对象,则 B 将不会在 A 后面渲染。

可以解决吗?

这是一个和图形一样古老的问题。使用非交换混合函数渲染半透明对象时,必须先绘制所有不透明对象,然后从后到前渲染透明对象。在过去几年中,深度剥离等技术已被用于近似与顺序无关的透明度,但每种此类技术都带有与渲染时间、内存和正确性相关的权衡。

假设您没有无法明确排序透明对象的病理情况,您将首先在启用深度写入和深度测试的情况下以常规方式渲染不透明对象,然后在禁用深度写入和启用深度测试的情况下从后向前绘制透明对象。这几乎是通过 alpha 混合获得"正确"结果的唯一方法。

相关内容

最新更新