Direct2D中的像素

问题描述 投票:10回答:3

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9LQ1o4dS5wbmcifQ==” alt =“在此处输入图像描述”>

深灰线应该是黑色且宽度为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中一样的像素精度,一个坐标=一个像素和纯色...

谢谢。

direct2d
3个回答
18
投票

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。


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);

希望它对某人有帮助...


0
投票

当我调整客户端大小时,drawrectangle别名始终不会是相同的结果。

我出现类似的闪烁。行的别名部分可以位于行的顶部,也可以位于行的顶部或底部,也可以不行。这导致该行在视觉上与先前的大小不同。

给人一种闪烁的感觉。是否可以在d2d中停用抗锯齿或仅在我们想要的形状上应用抗锯齿?我测试了0.5的方法,但是在调整大小时似乎不起作用。谢谢!!

© www.soinside.com 2019 - 2024. All rights reserved.