重叠Metal Point基元和混合

时间:2016-05-24 18:27:44

标签: metal metalkit

我正在渲染部分重叠的点基元。片段着色器将每个Point基元的部分阴影透明(实心圆心)。不与任何其他点基元重叠的点基元,按预期阴影(方形的透明区域显示背景)。

当这样的点原语与另一个点原语重叠时,该行为是意外的。具体来说:透明区域不显示不可取点原始图案的不透明颜色,而是清除它并显示背景颜色。

换句话说,具有较高顶点ID号的点基元清除具有较低顶点ID号的点基元的预先着色阴影片段。

点基元的编码如下:

command_encoder.drawPrimitives(.Point, vertexStart: 0, vertexCount: stroke.count) 

顶点&片段着色器看起来像这样:

vertex OutVertex vertex_func(constant InVertex* vertex_array [[buffer(0)]],
                          constant Uniforms& uniforms [[buffer(1)]],
                          uint vid [[vertex_id]]) {

    OutVertex out;
    InVertex in = vertex_array[vid];

    // transform vertex into NDC space
    out.position = uniforms.projection * float4(in.position.x, in.position.y, 0, 1);

    out.pointSize = 60;

    return out;
}

fragment float4 fragment_func(OutVertex vert [[stage_in]], float2 uv[[point_coord]]) {
    float2 uvPos = uv;

    uvPos.x -= 0.5f;
    uvPos.y -= 0.5f;

    uvPos *= 2.0f;

    float dist = sqrt(uvPos.x*uvPos.x + uvPos.y*uvPos.y);
    float circleAlpha = 1.0f-dist;

    half4 color = half4(0.0f, 0.0f, 1.0f, 1.0f);
    color *= circleAlpha;

    return float4(color.r, color.g, color.b, circleAlpha);
}

结果如下:

enter image description here enter image description here

我想了解如何防止清除重叠的透明区域,同时保持背景的透明度。

谢谢。

更新5/25/16:

我能够通过这些添加到我的渲染管道描述符来启用固定功能混合:

    rpld.colorAttachments[0].blendingEnabled = true
    rpld.colorAttachments[0].rgbBlendOperation = .Add;
    rpld.colorAttachments[0].alphaBlendOperation = .Add;
    rpld.colorAttachments[0].sourceRGBBlendFactor = .One;
    rpld.colorAttachments[0].sourceAlphaBlendFactor = .One;
    rpld.colorAttachments[0].destinationRGBBlendFactor = .OneMinusSourceAlpha;
    rpld.colorAttachments[0].destinationAlphaBlendFactor = .OneMinusSourceAlpha;

现在事情看起来像预期的那样:

enter image description here

0 个答案:

没有答案