如何让 ID2D1SolidColorBrush 在绘图时替换而不混合颜色?

How to make ID2D1SolidColorBrush replace and not blend colors when drawing?

我有一个用线条显示地形的小游戏。一个例子 "boulder":

绘制对象时,先绘制线条,然后在线条的末端绘制圆圈以平滑角。这是我如何创建画笔和绘制的相关代码:

// bi.color is of type D2D1::ColorF
bi.color = D2D1::ColorF::White;
bi.color.a = 1.0f - transparency;

ID2D1SolidColorBrush* pBrush = NULL;
p_RT->CreateSolidColorBrush(
    bi.color,
    &pBrush
);

p_RT->DrawLine(
    D2D1::Point2F(static_cast<FLOAT>(spos.x), static_cast<FLOAT>(spos.y)),
    D2D1::Point2F(static_cast<FLOAT>(epos.x), static_cast<FLOAT>(epos.y)),
    pBrush,
    bi.size
);

D2D1_ELLIPSE ellipse;
ellipse.point.x = cpos.x;
ellipse.point.y = cpos.y;
ellipse.radiusX = width;
ellipse.radiusY = height;

p_RT->FillEllipse(
    ellipse,
    pBrush
);

当巨石逐渐消失并且 color.a 值变得小于 1 时,问题就出现了。每个绘制函数都使用相同的画笔,但颜色最终组合并产生了这个结果:

有没有办法让画笔替换颜色而不是混合它们?如果是,怎么做?

Microsoft 文档中没有提到这一点。 ID2D1StrokeStyle* 函数中的 DrawLine 参数可能是我需要更改的内容,但我不知道该怎么做。

如果可以使用ID2D1DeviceContext,则可以使用SetPrimitiveBlend()切换混合模式。但我认为更好的解决方案是一次绘制整个多边形 - 您需要创建几何图形,向其中添加线条,然后使用所需的线条连接行为执行 DrawGeometry()。连接模式通过 ID2D1StrokeStyle 指定。

您应该使用 ID2D1GeometrySink 创建多边形对象,并使用 ID2D1RenderTarget::DrawGeometry 提供 ID2D1PathGeometry.

来绘制它,而不是逐行绘制

DrawGeometry 方法接受 D2D1_STROKE_STYLE_PROPERTIES,您可以在其中定义所需的线连接,例如D2D1_LINE_JOIN_ROUND