我启用混合使用:
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 混合获得“正确”结果的唯一方法。
关于ios - 图形 - 在缓冲区之间混合而不用考虑首先渲染哪个缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507966/