c++ - Freetype正确尺寸渲染

标签 c++ opengl freetype2

我目前正在编写一个渲染大量文本的 OpenGL 应用程序。文本渲染以前是使用 Qt 完成的,但出于性能原因,我们全部更改为 OpenGL 渲染。

我制作了所有着色器/渲染管道,它运行良好。 但再次阅读freetype的文档后,我仍然不明白如何以正确的尺寸正确渲染。

现在我使用该功能

FT_Set_Pixel_Sizes(face, 0, mFontSize);

设置字体大小,但我知道这是不正确的,因为 Qt 是以“点”渲染的(我猜..),所以所有文本现在都变小了。

我读到了有关使用该函数的信息

FT_Set_Char_Size(
      face,    /* handle to face object           */
      0,       /* char_width in 1/64th of points  */
      16*64,   /* char_height in 1/64th of points */
      300,     /* horizontal device resolution    */
      300 );   /* vertical device resolution      */

这是我的第一个问题,我应该在决议中加入什么?我无法知道屏幕的 DPI...我应该使用什么标准?

此外,无论缩放多少,我都需要文本在屏幕上保持固定大小。现在,我在 CPU 端预先计算字形的顶点,如本教程 https://learnopengl.com/In-Practice/Text-Rendering 所示。 但对于参数“scale”,我使用1.f/font_size。

然后,在着色器上我这样做

(camera * vec3(char_position.xy, 1)).xy + vertex.xy / viewport * font_size.

有了这个,我可以在屏幕上设置固定大小,按照我要求自由打字的最大尺寸为 45 像素。但从 Qt 渲染的角度来看,这是不正确的。

但我不知道如何使用 DPI“解决方案”来做到这一点

最佳答案

如果您无法计算系统的准确 DPI(我对此非常怀疑;请检查您的文档),那么您将需要执行大多数其他解决方案所做的操作:猜测。

例如,Windows 假定 DPI 96 对于大多数系统来说是“正常”的,如果您无法提供准确的数字,那么它可能是适合您的项目的数字。

因此,如果您绝对无法获得准确的 DPI 数字,只需输入 96,然后从那里缩放字体大小即可。

关于c++ - Freetype正确尺寸渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60061441/

相关文章:

render - 为什么渲染字形这么慢?

c++ - 将图像放置在较大图像的特定位置

C++ 问题 : conflicting declaration

c++ - 无法将参数 1 从 'const char *' 转换为 'const wchar_t *'

opengl - vec4上的GLSL <>运算符

c++ - 无法将纹理应用于 Qt OpenGL 中的顶点网格

c++ - 使用 Freetype 获取 .bdf 字体的名称

c++ - 如何将基类更改为继承类?

c++ - 为什么我的自适应选择排序算法在C++中不起作用