如何用像素捕捉绘制GlyphRun?

时间:2019-07-04 21:47:04

标签: c# c++ graphics directx rendering

我使用ID2D1RenderTarget::DrawGlyphRun方法来渲染文本,但是它有点模糊。但是,如果我使用ID2D1RenderTarget::DrawTextLayout方法,则文本会非常清楚地显示出来,因为DirectWrite执行PixelSnapping

所以我的问题是,即使我使用ID2D1RenderTarget::DrawGlyphRun方法,如何也可以进行像素捕捉?

我试图四舍五入坐标:

(int)(baselineOrigin.Y + 0.5f)

但这仅在某些情况下有用。

使用Direct2D渲染文本之前舍入坐标的正确方法是什么?

非常感谢,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

简短的回答是您无法使用DrawGlyphRun()来做到这一点。像素捕捉模式通过Direct2D实现的IDWriteTextLayout::Draw()传递到IDWriteTextRendererDrawGlyphRun()无法在布局上运行,因此您没有相同的控制方式。

关于坐标舍入,您可能想要在水平方向上进行舍入以进行水平布局,但是您的示例没有这样做。

答案 1 :(得分:1)

为了避免文本模糊,字形的Y位置应四舍五入。和您一样:

(int)(baselineOrigin.Y + 0.5f)

但是,您还应该考虑ID2D1RenderTarget::GetTransform。 如果“变换”引起的缩放比例不是1或导致了垂直偏移,则需要计算字形将出现的实际位置,然后才进行舍入。