繁体   English   中英

有没有办法在 Metal 中同时启用混合和深度

[英]Is there a way to enable blending and depth at the same time in Metal

我有一个显示一些纹理四边形的金属视图。 纹理是从 PNG 加载的,因此是预乘的。 一些纹理具有透明像素。

当我启用混合并以正确的顺序绘制时,透明度会起作用,您可以通过纹理的透明部分看到其他四边形下方的四边形。 但是,我必须通过排序来计算正确的绘制顺序,这很昂贵并且会大大减慢我的渲染速度。

当我尝试使用深度模板并以任何顺序绘制时,我可以使用 z 位置使顺序正确工作,但随后混合停止工作。 纹理的透明部分显示金属场景的背景颜色,而不是下面的四边形。

我究竟做错了什么? 有没有办法让它工作,有人可以提供一些示例代码吗?

我看到的另一个选择是尝试在 GPU 上进行排序,这很好,因为 GPU 帧时间明显小于 CPU 帧时间。 但是,我也不确定该怎么做。

任何帮助将不胜感激。 :)

Alpha 混合是一种依赖顺序的透明技术。 这意味着(半)透明对象不能像(更昂贵的)与顺序无关的透明技术那样以任意顺序呈现。

  • 确保您的透明 2D 对象(例如,圆形、矩形等)具有不同的深度值。 (这样你可以自己定义绘制顺序。否则绘制顺序取决于排序算法的实现和排序前的初始排序。)
  • 根据深度值从后到前对这些 2D 对象进行排序。
  • 使用 alpha 混合从后向前绘制 2D 对象(画家算法)。 (当然,您的 2D 对象需要一个 < 1 的 alpha 值才能真正看到一些混合。)

你需要正确设置 pipelineStateDescriptor :

    // To have depth buffer.
    pipelineStateDescriptor.depthAttachmentPixelFormat = .depth32Float

    // To use transparency.
    pipelineStateDescriptor.colorAttachments[0].isBlendingEnabled = true
    pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = .add
    pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = .add
    pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
    pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
    pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
    pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

希望这可以帮助。 这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM