
深灰色线应该是黑色和1像素宽:
pRT->DrawLine(Point2F(100, 120), Point2F(300, 120), blackbrush, 1);
Run Code Online (Sandbox Code Playgroud)
浅灰色线应该是黑色和0.5像素宽:
pRT->DrawLine(Point2F(120, 130), Point2F(280, 130), blackbrush, 0.5);
Run Code Online (Sandbox Code Playgroud)
相反,它们都是2像素宽.如果我要求宽2像素,则线条为黑色,但自然宽2像素.
渲染目标具有与窗口的客户区域相同的大小.我希望像GDI中的像素精度,一个坐标=一个像素和纯色......
谢谢.
Ric*_*ter 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;对于其他strokeWidth,由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.
你可以玩pRenderTarget->DrawLine(Point2F(100-0.5, 120-0.5), Point2F(300-0.5, 120-0.5), blackbrush, 1),但它变得很快变得棘手.最简单的是:
pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
Run Code Online (Sandbox Code Playgroud)
希望它有助于某人......
| 归档时间: |
|
| 查看次数: |
4008 次 |
| 最近记录: |