【问题标题】:color is incorrect when draw metal triangles with an alpha color. such as (0.9,0.6,0,0.4)使用 Alpha 颜色绘制金属三角形时颜色不正确。如 (0.9,0.6,0,0.4)
【发布时间】:2019-04-28 09:08:24
【问题描述】:
vertex Vertex
line_vertex_main(device Vertex *vertices [[buffer(0)]],
                 constant Uniforms &uniforms [[buffer(1)]],
                 uint vid [[vertex_id]])
{
  float4x4 matrix = uniforms.matrix;
  Vertex in = vertices[vid];
  Vertex out;
  out.position = matrix * float4(in.position);
  out.color = in.color;
  return out;
}

fragment float4
line_fragment_main(Vertex inVertex [[stage_in]])
{
  return inVertex.color;
}

颜色不正确。 color(0.9,0.6,0,0.4) 在金属中变成了一种奇怪的颜色: 左边是正确的,右边是用金属画的

绘制没有 alpha 颜色的金属三角形时颜色正确, 右边是用金属画

【问题讨论】:

  • 你是如何确定左边的图是“正确的”而右边的是“不正确的”?因为你有一个非 1.0 的 alpha,我假设你正在混合。 “源过度”混合将使用 (source.r * source.a + dest.r * (1 - source.a)) 表示红色。对于在不透明的白色背景上混合的颜色,这将是 (0.9 * 0.4 + 1.0 * (1 - 0.4)) -> (0.9 * 0.4 + 1.0 * 0.6) -> (0.36 + 0.6) -> 0.96。对其他颜色分量执行相同操作会得到 (0.96, 0.84, 0.6, 1.0)。将其输入任何 RGB 颜色查看器,它与右侧的颜色非常接近,具体取决于配置文件。
  • 您的颜色没有预乘。我相信您需要先对它们进行预乘。

标签: ios metal


【解决方案1】:

您的混合模式未配置。您可以在 MTLRenderPipelineDescriptor 上配置混合。

【讨论】:

  • 谢谢~:) 我尝试混合模式但没有用。但是当混合和红色/绿色/蓝色部分乘以 alpha 时,然后将其提供给顶点数组。颜色正确
  • 添加混合模式时,如何解决覆盖自身问题。使用深度?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多