ios - 图形 - 在缓冲区之间混合而不用考虑首先渲染哪个缓冲区

标签 ios graphics metal

我启用混合使用:

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/

相关文章:

scenekit - 如何使用 SCNProgram 将纹理传递给 Metal 的片段着色器?

graphics - 确定现有 DDS 纹理文件的 block 压缩格式

opengl - 我是否需要 Gamma 校正现代计算机/显示器上的最终色彩输出

java - 处理 AWT 图形上下文的最佳方式是什么?

ios - OpenGLES将代码混合到 Metal 翻译

swift2 - 为什么我没有得到这个 Metal 内核的结果

ios - 仅广告数据与连接 BLE 设备的优势

ios - 同步 NSURLConnection 和端口使用?

ios - 如何以编程方式以模态方式呈现 View Controller ?

ios - 我可以在 sprite kit 游戏中使用核心数据吗?