【问题标题】:Freetype 2. Is there a way to change the size of the font in pixels after you have loaded it?Freetype 2. 有没有办法在加载后更改字体大小(以像素为单位)?
【发布时间】:2016-04-30 04:41:23
【问题描述】:

所以我正在尝试用 C++ 创建一个简单的游戏引擎。我需要渲染一些文本,所以我使用本教程 (http://learnopengl.com/#!In-Practice/Text-Rendering) 作为指导。它使用库 freetype 2。

一切都很好,文本正在渲染。但是现在当我充实 ui 并创建标签时,我希望能够更改文本的大小。我可以通过缩放文本来做到这一点,但我希望能够通过使用像素来做到这一点。

在这里您可以看到缩放的效果:

    GLfloat xpos = x + ch.Bearing.x * scale;
    GLfloat ypos = y + linegap + (font.Characters['H'].Bearing.y - ch.Bearing.y) * scale;

    GLfloat w = ch.Size.x * scale;
    GLfloat h = ch.Size.y * scale;

所以在我的方法 renderText 中,我只传递了一个缩放变量,它会缩放文本。但我更喜欢使用像素,因为它对用户更友好,有什么方法可以在 freetype 2 中做到这一点,还是我坚持使用比例变量?

【问题讨论】:

  • 这里不清楚你的意思。听起来您想重新生成字形,以更高的分辨率重新光栅化它们。好吧,你必须真正这样做。这意味着,当大小发生变化时,您必须再次完成获取字形数据的任何过程。
  • 我觉得自己没有考虑到这一点很愚蠢,但感谢 Cornstalks,效果很好。当大小设置为低于它生成的大小时,文本看起来不太好,但我认为那是因为我选择的字体。再次感谢 Cornstalks!
  • @assasinDN:很好,很高兴它有帮助!我已将我的评论移至答案中,以便您可以将问题标记为已回答。

标签: c++ text text-rendering freetype2


【解决方案1】:

假设您不想以不同的分辨率重新生成字形,而是想将比例指定为像素单位而不是比率(即您想说scale = 14 pixels 而不是scale = 29%),那么您可以执行以下操作: 将您传递的高度值保存到FT_Set_Pixel_Sizes(在教程中为 48)。现在,如果您想要 14 像素渲染,只需将 14 除以该数字 (48),即为 scale = 14.0f / 48.0f。这将为您提供从最初以 48 像素高度生成的字体以 14 像素比例渲染所需的缩放比例。

当您这样做以改善结果时,您可能还想使用 OpenGL 纹理过滤器或 mipmapping。此外,字体有时具有低分辨率像素提示,这有助于即使在低分辨率下也能清晰地呈现它们;不幸的是,当您生成高分辨率纹理然后将其缩小到较小的渲染尺寸时,此提示信息会丢失/未使用,因此它可能看起来不像您希望的那样清晰。

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2010-11-06
    • 2011-08-17
    • 2013-04-26
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多