【问题标题】:With Metal (vs OpenGL), How does color/alpha blending work on single-channel render targets?使用 Metal(vs OpenGL),颜色/alpha 混合如何在单通道渲染目标上工作?
【发布时间】:2018-04-21 11:07:42
【问题描述】:

我正在从一篇技术论文中移植一些 OpenGL 代码以用于 Metal。在其中,他们使用只有一个通道的渲染目标 - 一个 16 位浮点缓冲区。但随后他们像这样对其进行混合操作:

glBlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

只有一个通道,这是否意味着在 OpenGL 中,目标默认为 alpha 通道?

有谁知道Metal是不是也一样?我没有看到我期望的结果,我想知道 Metal 是否有所不同,或者是否有一个设置可以控制单通道目标在混合方面的处理方式。

【问题讨论】:

  • 不是 100% 确定,但是拥有单通道帧缓冲​​区并不意味着着色器不能另外输出 alpha 值。您不会存储目标 Alpha,但仍然可以有一个可用于混合计算的源 Alpha。

标签: opengl metal alphablending blending


【解决方案1】:

在 OpenGL 中,image format 通道使用它们的通道显式标记。只有一种单通道颜色格式:GL_R*(显然具有不同的位深度和其他信息)。也就是说,只有红色。虽然texture swizzling 可以使红色通道出现在纹理提取的其他通道中,但这不适用于帧缓冲区写入。

此外,该混合函数实际上并不使用 destination alpha。它只使用源 alpha,它具有 FS 给它的值。因此,帧缓冲区不存储 alpha 的事实本质上是无关紧要的。

【讨论】:

  • 谢谢——不过我还是有点困惑。在此示例中,目标乘数为 1 - srcAlpha。在这种情况下 srcAlpha 是什么?通常我会认为它是片段着色器返回的 alpha 值,这不正确吗?但是对于目标是单通道的着色器来说,没有 alpha 值。你看到我的困惑了吗?
  • @bsabiston:“但是目标是单通道的着色器没有 alpha 值。”谁说的?源 alpha 是片段着色器的 输出。该输出不关心帧缓冲区包含或不包含的内容。只有 destination 值关心这一点。
  • 我的片段着色器输出一个浮点数,因为它以单通道缓冲区为目标。据我所知,Metal 似乎认为这是一个颜色值,而不是 alpha 值。
  • 为什么你认为你必须返回一个浮点数?您的片段着色器应该能够返回float4
  • 一个“返回类型缓冲区”?着色器返回类型(或结构返回类型的 [[color]] 字段)必须与通用类型(float vs. int vs. uint)的渲染目标纹理匹配,但不一定在组件数量上。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多