Direct2D中的像素

时间:2012-05-26 05:10:39

标签: direct2d

enter image description here

深灰色线应该是黑色和1像素宽:

pRT->DrawLine(Point2F(100, 120), Point2F(300, 120), blackbrush, 1);

浅灰色线应该是黑色和0.5像素宽:

pRT->DrawLine(Point2F(120, 130), Point2F(280, 130), blackbrush, 0.5);

相反,它们都是2像素宽。如果我要求宽2像素,则线条为黑色,但自然宽2像素。

渲染目标的大小与窗口的客户区相同。我希望像GDI中的像素精度,一个坐标=一个像素和纯色......

感谢。

2 个答案:

答案 0 :(得分:16)

Direct2D正确渲染。当你给它一个像素坐标,如(100,120),它指的是从像素坐标(100,120)到(101,121)跨越的像素元素的左上角(顶部/左边是包含的,右/下是独家的)。由于它是一条直线水平线,因此你可以从(99.5,119.5) - (300.5,120.5)得到一个填充矩形。由于此溢出的边缘溢出到相邻的像素中,这就是为什么你得到" 2像素宽度" "错误"亮度。您必须考虑像素坐标(没有区域的点)和像素元素(屏幕上的物理点,面积为1x1,当然只有1)。

如果你想画一条覆盖像素(100,120)到(300,120)的直线,你应该使用SemMike建议使用别名渲染(这对于直线来说非常棒! ),或者你可以使用半像素偏移(因为strokeWidth = 1;对于其他strokeWidths,由strokeWidth / 2调整)。从(100.5,120.5) - (299.5,120.5)绘制,笔划宽度为1.0将为您提供您正在寻找的东西。该笔划围绕您指定的像素坐标延伸,因此您将获得"填充的矩形"在像素元件(100,120) - (300,121)上方。而且,这是一个独家范围,所以' y = 121'实际上并没有填充,x = 300也没有。

如果您想知道为什么GDI之类的事情不会发生,那是因为它没有进行抗锯齿渲染,所以一切都会捕捉到像素元素。如果你想知道为什么在使用Shapes时WPF不会发生这种情况,那是因为它使用了布局舍入(UseLayoutRounding)和像素捕捉。 Direct2D不提供这些服务,因为它是一个相对较低级别的API。

答案 1 :(得分:5)

您可以使用pRenderTarget->DrawLine(Point2F(100-0.5, 120-0.5), Point2F(300-0.5, 120-0.5), blackbrush, 1),但它会变得非常棘手。最简单的是:

pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);

希望它有助于某人...