为什么DirectX/DirectWrite/Direct2D文本渲染不如GDI锐利?

22

我已经知道亚像素定位会导致DirectWrite在文本渲染上比GDI模糊

但我的问题更加基础:为什么 DirectWrite(和相关方法)无法像GDI一样锐利地呈现文本?

换句话说:
是什么阻止 DirectWrite能够将文本对齐到最近的像素,就像GDI一样吗?

例如,这是硬件问题还是驱动程序架构问题?它是否只是未实现?或者其他原因?


较小的示例:

较大的示例:

直接 2D,带锯齿:

直接 2D,默认:

直接 2D(“经典 GDI”):

直接 2D(“自然 GDI”):

实际的 经典 GDI:

![](http://i.stack.imgur.com/kbdPb.png)

实际的 ClearType GDI:

enter image description here


注意:如果您认为所有这些都模糊,请运行

document.body.style.zoom = 1 / window.devicePixelRatio
在Chrome的控制台中查看并在之后查看它。

嗯,是的,我想看到这个问题的答案。这些技术生成的文本太模糊了,使它们不值得使用;我甚至不能使用使用DirectWrite呈现文本的产品(咳咳,Firefox)。不幸的是,我有一种隐隐的感觉,即没有人认为这很重要。 - Cody Gray
1
由于像素对齐会使得渲染文本的宽度变得不可预测。分辨率独立的文本渲染是最理想的情况。但这一点被GDI+所搞砸,在WPF中是一个硬性要求,而且需要持续改进显示技术。 - Hans Passant
5
DWrite可以做到,您只需要提出要求。创建clearTypeLevel设置为零的自定义呈现参数。请注意,锐利度是以精度为代价的。例如请查看旋转文本,在GDI中它看起来很粗糙,而且与次像素相比,在GDI中间距不均匀。 - Raymond Chen
@HansPassant:如果渲染文本的宽度是不可预测的,那么GDI是如何做到的呢? - user541686
1
@Mehrdad 我自己从未尝试过,但从阅读文档来看,它似乎应该可以工作。也许它只是切换到了灰度抗锯齿?无论如何,如果你不喜欢DirectWrite,就不要使用它。(问题并不在于宽度不可预测,而在于不均匀。在低分辨率下,一个整像素非常大。) - Raymond Chen
显示剩余6条评论
1个回答

19

你现在比较的不是同一类东西。你的Direct2D示例都是以灰度渲染,而GDI和Linux示例则使用了子像素抗锯齿(又称为Windows上的ClearType)。

此页面描述了启用ClearType所需做的事情: http://msdn.microsoft.com/en-us/library/windows/desktop/dd368170%28v=vs.85%29.aspx

注意:在测试像这样的渲染时,最好使用Windows放大镜或类似工具来检查您实际上是否得到了您认为得到的内容。


1
我认为关于Linux的部分不正确(因为“Cleartype”是微软的东西,而且Linux的那个实际上并不完全像GDI),但是其他部分都是准确的。当我使用pRenderTarget->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE)时,Direct2D的结果几乎与GDI完全相同。 - user541686
我会为你提供赏金,因为我认为这非常值得。 :) - user541686
是的,ClearType是微软实现的子像素抗锯齿技术,因此它不是Linux使用的技术。我稍微澄清了一下文本。谢谢您的赏金! - arx
当然可以!我现在不能提供它,因为需要一天左右的时间,但我会尽快授予它!顺便说一句,使用Direct2D和ClearType的结果在这里 - 就像GDI在清晰度方面一样。 :) - user541686
@Mehrdad 不完全正确。它仍然缺乏纯净的一致性,软件渲染的Cleartype。你发布的是硬件渲染,旨在尽可能接近软件Cleartype。对于我的敏锐眼睛来说仍然模糊不清。 - Dmitry Sychov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接