如何让 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
我有一个用线条显示地形的小游戏。一个例子 "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