Winapi 我不知道';我不能完全理解D2D1图开始:为什么需要它,什么';这就是区别,为什么微软';s示例代码类型是否仍然不匹配?

Winapi 我不知道';我不能完全理解D2D1图开始:为什么需要它,什么';这就是区别,为什么微软';s示例代码类型是否仍然不匹配?,winapi,direct2d,Winapi,Direct2d,在我将GDI代码迁移到Direct2D之前,我正在阅读Direct2D,并试图弄清楚路径是如何工作的。我了解与几何体和几何体下沉有关的大部分工作,但有一件事我不了解:D2D1\u FIGURE\u BEGIN类型及其参数toBeginFigure() 首先,为什么需要这个值?为什么几何体需要提前知道它是填充的还是空心的?我不知道还有哪种绘图API关心路径对象是否提前填充;您只需定义形状的端点,然后调用fill()或stroke()来绘制路径,那么几何图形有什么不同呢 如果这个参数是必需的,那么选

在我将GDI代码迁移到Direct2D之前,我正在阅读Direct2D,并试图弄清楚路径是如何工作的。我了解与几何体和几何体下沉有关的大部分工作,但有一件事我不了解:
D2D1\u FIGURE\u BEGIN
类型及其参数to
BeginFigure()

首先,为什么需要这个值?为什么几何体需要提前知道它是填充的还是空心的?我不知道还有哪种绘图API关心路径对象是否提前填充;您只需定义形状的端点,然后调用
fill()
stroke()
来绘制路径,那么几何图形有什么不同呢

如果这个参数是必需的,那么选择一个值而不是另一个值如何影响我绘制的形状

最后,如果我正确理解了此枚举的用法,则应该只使用带有
FillGeometry()
的填充路径和带有
DrawGeometry()
的空心路径。但是,由多个方法引用的文档页面(如)创建一个填充图形,并使用
DrawGeometry()
FillGeometry()
绘制它!这是未定义的行为吗?它是否与示例图片中渐变周围的蓝色边框有关,而我在代码中的任何地方都没有看到

谢谢

编辑好的,我想我理解了渐变的奇怪轮廓:渐变也在转换alpha值,填充与笔划重叠,因为笔划位于直线的中心,填充在笔划之后绘制。这仍然不能解释为什么我可以用填充几何体填充和笔划,或者空心几何体和填充几何体之间的区别是什么


另外,我刚刚意识到空心几何体被记录为没有边界。这是否意味着空心几何体纯粹是对仅笔划几何体的优化,否则其行为与填充几何体相同?

如果您想更好地了解Direct2D的几何体系统,我建议您学习WPF几何体系统。WPF、XPS、Direct2D、Silverlight和更新的“XAML”框架都使用相同的构建块(如果您愿意,则使用相同的“语言”)。我发现在WPF中更容易理解声明性面向对象API,之后在Direct2D中使用命令式API就轻而易举了。您可以将WPF的可变几何体系统视为Java中“builder”模式的实现,其中build()方法在幕后(对您隐藏),当需要在屏幕上渲染东西时,会抛出一个不可变的Direct2D几何体(WPF使用称为“MIL”的东西),IIRC/AFAICT,Direct2D就是从中派生出来的。它们实际上是一样的!)编写代码在两种表示形式之间进行转换也很简单,例如,遍历WPF PathGeometry并将其流式传输到Direct2D geometry接收器,您还可以使用和自定义的
ID2D1GeometrySink
实现来重建WPF路径几何体

(顺便说一句,这不是理论上的:)这正是我在Paint.NET 4.0+中所做的:我使用WPF风格的声明性可变对象模型,在渲染时吐出不可变的Direct2D几何体。它工作得非常好!)

好的,不管怎样,直接进入您的特定问题:
beginigure()
D2D1\u FIGURE\u BEGIN
直接映射到WPF中的属性。为了直观地了解这有什么影响,您可以使用KaXAML之类的工具来处理WPF或Silverlight示例中的一些几何图形,并查看结果。对于WPF和Silverlight,文档显然比Direct2D更好

另一个关键概念是
DrawGeometry
基本上是一种辅助方法。你可以先用
FillGeometry
加宽你的几何图形,然后用
FillGeometry来完成同样的事情(“加宽”对我来说似乎是个误称,顺便说一句:在Photoshop或Illustrator中,你可能会用“笔划”这样的动词)。这并不是说任何一方的表现总是更好/更差。。。一定要做基准测试。我看到它是双向的。之所以可以将其视为辅助方法,是因为最低级别的光栅化引擎只能完成一件事:填充三角形。所有其他图形“基本体”都必须转换为三角形列表或条带(这也是
ID2D1Mesh
速度如此之快的原因:它绕过了各种处理代码!)。填充几何体需要将其内部细分为三角形条带列表,然后可由Direct3D填充。“绘制”几何体需要应用笔划(宽度和/或样式):即使是简单的1像素宽的直线也必须首先转换为2个填充三角形


哦,另外,如果您想计算具有空心图形的几何体的“真实”边界,请使用strokeWidth为零的
ID2D1Geometry::GetWidedBounds
。Direct2D和WPF之间的差异让我感到困惑
Geometry.Bounds
(在WPF中)相当于
ID2D1Geometry::GetWideedBounds(0.0f)

好的,谢谢。我会记住你的建议。首先,尽管如此:我假设
加宽()?这就是我从WPF文档中推断的;但我只是想确定一下,因为这会澄清你上面说的一些话。(至于“加宽”这个术语,你可能已经知道了,但是。)试着不要认为一条路“有”一个内部。什么是“有”取决于你用它做什么。考虑填充与画圆(椭圆)直径D的例子:填充它会做什么Y