直线的Direct2D/DirectX光栅化规则

直线的Direct2D/DirectX光栅化规则,directx,direct2d,Directx,Direct2d,我已经阅读了有关DirectX光栅化规则的在线文档,但我仍然不明白为什么这段代码不能在屏幕上显示任何内容 目标->设置抗锯齿模式(D2D1抗锯齿模式抗锯齿) 目标->绘制线(D2D1::Point2F(0.f,0.f), D2D1::点2F(10.f,0.f),红刷,1.f) 当然,如果我将两个线点的y从0.0f更改为1.0f,我会在窗口客户端区域的左上方看到一条可见的水平线,但我想了解这里涉及的原则。我无法从可用的文档中找出它们。您应该在“像素中间”画一条线: 否则,如果不使用抗锯齿,可以在0

我已经阅读了有关DirectX光栅化规则的在线文档,但我仍然不明白为什么这段代码不能在屏幕上显示任何内容

目标->设置抗锯齿模式(D2D1抗锯齿模式抗锯齿)
目标->绘制线(D2D1::Point2F(0.f,0.f), D2D1::点2F(10.f,0.f),红刷,1.f)

当然,如果我将两个线点的y从0.0f更改为1.0f,我会在窗口客户端区域的左上方看到一条可见的水平线,但我想了解这里涉及的原则。我无法从可用的文档中找出它们。

您应该在“像素中间”画一条线:

否则,如果不使用抗锯齿,可以在0/0…10/0线的任一侧绘制线。在您的例子中,它是在窗口画布之外绘制的

请注意,屏幕上的像素实际上是一个矩形,坐标为
D2D1::Point2F(0.0f,0.0f)
D2D1::Point2F(1.0f,1.0f)


点2f(0.5f,0.5f)是该矩形的中心。如果围绕该坐标绘制1x1矩形,它将完全覆盖像素

哦,看起来我在读光栅化规则,这些规则使用了DirectX 10和更高版本中未使用的坐标系:DirectX 10和更高版本中的别名线是否有新的所谓菱形区域规则?这些是Direct2D、Skia、Cairo、GDI+使用的常见“规则”。在锯齿渲染中,如果像素的中心恰好位于轮廓内,则会绘制像素,这也是计算精度的问题。在您的案例中定义的一条像素线是一个从0,-0.5(包括)到10.0,+0.5(不包括)的矩形。因此,位图零行中的像素不会被渲染所影响。我理解,现在我不再像在DirectX 9中那样,将0,0作为最上面、最左边的像素中心。但是,您确定GDI+吗?也就是说,我困惑的另一个原因是在GDI+中,类似于graph.DrawLine的代码(pen,0,0,10,0);对于1.0宽画笔,无论是在混叠模式还是抗混叠模式下,都会产生一条可见的线。这取决于特定的约定,GDI+可能会将线解释为一个矩形,从0开始,-0.5互斥,到10.0,-0.5互斥。D2D显然在这方面更为正确。通常,在使用别名基本体时,应切换到FillRectangle(),而不是使用DrawLine()。另一个选项是设置
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(0.5,0.5))在绘制之前,但如果要考虑高于96 dpi的曲面,这是很棘手的。
target->DrawLine(D2D1::Point2F(0.0f, 0.5f), D2D1::Point2F(10.f, 0.5f), redBrush, 1.f);