【问题标题】:Rendering results with alpha blending on Metal are not as expected在 Metal 上使用 alpha 混合的渲染结果不如预期
【发布时间】:2021-11-08 20:10:15
【问题描述】:

我想使用 Metal 进行屏幕外渲染并使用 alpha Blending 等使其看起来像一个完整的绘图。 我希望通过将在 OpenGL 上制作的内容移植一次,可以使用 Metal 复制该程序。

离屏渲染时的流水线

renderToTextureRenderPassDescriptor.colorAttachments [0] .clearColor = MTLClearColor (red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)

目前的状态下,周围已经变黑了,

 MTLClearColor (red: 1.0, green: 1.0, blue: 1.0, alpha: 0.0)

这很自然,但整个事情都变白了,

MTLClearColor (red: 0.5, green: 0.5, blue: 0.5, alpha: 0.0),两者都在中间,颜色出来了,但和我想象的相差甚远。

即使不清除Color,也是一样的,我认为这部分不是根本原因,我认为是Shader本身的问题或者最终Rendering处Pipeline中描述的问题阿尔法混合的时间。 问题之一是最终渲染时OpenGL中的gl.clearColor (1.0, 1.0, 1.0, 1.0);还没有实现。我想知道它是否可以像 Apple 的开发者页面那样完成,但没有成功。

https://developer.apple.com/documentation/metalkit/mtkview/1536036-clearcolor

Shader 并不特殊,它使用距离函数的圆作为 alpha,在 alpha 混合和最终渲染时作为纹理粘贴。

我不想要像在白色背景上用红色圆圈渲染这样简单的方法,因为我重视 alpha 混合的结果。

我们已经可以下载实际代码,这是一个当前示例。网址如下。 https://sgaworks.com/code/MetalCodeSample.zip

【问题讨论】:

    标签: ios swift metal


    【解决方案1】:

    您的MTKView 不透明。您正在为纹理写出适当的 alpha 值,但由于您的视图是不透明的,因此合成器只会丢弃 alpha 并显示 RGB 纹理。

    您可以通过将isOpaque 设置为false 来使您的视图透明。这将强制合成器将您的可绘制对象与其下方的任何内容混合。

    这是我通过设置 mtkView.isOpaque = false 和暗模式得到的图像:

    这个是关闭黑暗模式的:

    【讨论】:

    • 谢谢。给View ControllermtkView.device = mtlDevice mtkView.framebufferOnly = true mtkView.isOpaque = false写了,但是结果是背景没有变成白色背景而是一直是黑色背景。我还缺少什么吗?
    • 您需要在其下方有一个视图或背景颜色。例如,您可以在我的屏幕截图中看到,颜色不是黑色,而是灰色。这是因为我打开了暗模式,如果我关闭暗模式,它将在下面显示系统白色。我已经更新了答案以包含屏幕截图。除了CAMetalLayer 之外,我不精通UIKitAppKit 的具体细节,所以我没有更具体的答案。
    • 我在一部真正的 iPhone 上运行它,黑暗模式从一开始就关闭了。如果您按原样执行示例代码,在问题文本所附的屏幕截图中,它将是一个黑底红圈,您将瞄准白底红圈。 mtkView 应该有单独的背景颜色吗?
    • 我认为背景颜色不适用于 MTKView。我认为在您的情况下,您可以为可绘制纹理选择一种清晰的颜色,即您想要的“背景”颜色。
    • 我觉得是你教我的关于透明度的方法,但是你怎么改变背景颜色呢?我应该使用CAMetalLayer 而不是MTKView
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多