我正在使用以下方式启用混合:
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后面。
可以解决吗?
答案 0 :(得分:1)
这是一个与图形一样古老的问题。使用非交换混合函数渲染半透明对象时,必须先绘制所有不透明对象,然后从后向前渲染透明对象。在过去几年中,深度剥离等技术已用于近似与顺序无关的透明度,但每种此类技术都需要与渲染时间,内存和正确性相关的权衡。
假设您没有无法明确排序透明对象的病态情况,您将首先以通常的方式渲染不透明对象,并启用深度写入和深度测试,然后通过深度从后向前绘制透明对象禁用写入和启用深度测试。这几乎是通过alpha混合获得“正确”结果的唯一方法。