我正在渲染部分重叠的点基元。片段着色器将每个点基元正方形的部分着色为透明(实心中心圆)。不与任何其他点基元重叠的点基元将按预期着色(正方形的透明区域显示背景)。
当这样的点基元与另一个点基元重叠时,行为是意外的。具体来说:透明区域不显示周围点图元的不透明颜色,而是清除它并显示背景颜色。
换句话说,具有较高顶点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);
}
结果如下:
我想了解如何防止清除重叠的透明区域,但保持背景的透明度。
谢谢。
2016 年 5 月 25 日更新:
我能够打开固定功能混合,并将这些添加到我的渲染管道描述符中:
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;
现在事情看起来正如预期的那样: