Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自由类型生成不对称图示符_C++_Opengl_Freetype - Fatal编程技术网

C++ 自由类型生成不对称图示符

C++ 自由类型生成不对称图示符,c++,opengl,freetype,C++,Opengl,Freetype,因此,我尝试在图形引擎中使用带符号的距离字段实现字体渲染 为此,我使用FreeType库生成所有字母的字形。具体来说,我尝试加载单色位图,如下所示: FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO) 然后我从glyph缓冲区中提取所有位,并将其放入单色黑白纹理中,我可以将其显示在屏幕上进行测试 我提取位并将其放入字节数组的代码: FT_Bitmap bm = face->glyph->bitmap; FT_Bi

因此,我尝试在图形引擎中使用带符号的距离字段实现字体渲染

为此,我使用FreeType库生成所有字母的字形。具体来说,我尝试加载单色位图,如下所示:

FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO)
然后我从glyph缓冲区中提取所有位,并将其放入单色黑白纹理中,我可以将其显示在屏幕上进行测试

我提取位并将其放入字节数组的代码:

FT_Bitmap bm = face->glyph->bitmap;

FT_Bitmap mono;
FT_Bitmap_New(&mono);
//convert from 8 pixel per byte to 1 pixel per byte
FT_Bitmap_Convert(ft, &bm, &mono, 1);
//set each byte from 0/1 to 0/255
for (int y = 0; y < mono.rows; y++) {
    for (int x = 0; x < mono.width; x++) {
        mono.buffer[y * mono.width + x] *= 255;
    }
}
FT\u位图bm=面->字形->位图;
傅里叶变换;
FT_位图_新建(&mono);
//从每字节8像素转换为每字节1像素
FT_位图_转换(FT、bm和mono,1);
//将每个字节从0/1设置为0/255
对于(int y=0;y
然而,我的问题是,FreeType生成的glyphs似乎是不对称的

例如,这是使用OpenSans常规字体的字体像素大小为64的字母M:

这是字母M,字体相同,像素大小为1024:

我尝试过使用多种字体、多种字体大小等,某些字形总是保持不对称。 还请注意,我手动读取纹理像素数据,以验证OpenGL的纹理缩放或其他操作不会导致错误

关于为什么FreeType似乎会产生不对称的字形,有没有人能告诉我,在以后渲染文本时,这是否会成为一个问题


编辑:我现在使用库函数提取位,所以错误一定在FreeType中的某个地方。

您在这里假设OpenSAN是一种所有GLPYH都是对称的字体。事实并非如此,也不是FreeType错误。您可以随时向freetype列表发送电子邮件,但可能会得到相同的答案

这并不是不准确,因为字体设计师设计的M字形不是对称的,无论出于什么原因。很多时候,这样做是为了增加可读性。稍微不对称将导致提示引擎以稍微不同的方式栅格化标志符号,使其更清晰或看起来更“清晰”。下面是一些截图来证明这一点

首先,这是一个Windows10/Chrome55的大幅放大屏幕截图,在浏览器中以网站允许我选择的最小尺寸呈现字形。虽然乍一看它是对称的,但事实并非如此

其次,我下载了字体并在FontForge中打开了它。如果仔细观察,可以看到两侧内侧边缘上的曲线实际上略有不同。我还花了一点时间看了定义M底部中心的两个点。它们的位置是(848,0)和(985,0)。这两个点之间的中点为(916.5,0),但是定义此轮廓部分上边缘的两个点位于(920,256)和(928,256)。这将稍微向右移动


如果您正在寻找对称字体或其他简单字体,请寻找面向程序员的字体或控制台字体。Arial、Console、Courier New等可能非常适合这一要求。

您在这里假设OpenSAN是一种所有GLPYH都是对称的字体。事实并非如此,也不是FreeType错误。您可以随时向freetype列表发送电子邮件,但可能会得到相同的答案

这并不是不准确,因为字体设计师设计的M字形不是对称的,无论出于什么原因。很多时候,这样做是为了增加可读性。稍微不对称将导致提示引擎以稍微不同的方式栅格化标志符号,使其更清晰或看起来更“清晰”。下面是一些截图来证明这一点

首先,这是一个Windows10/Chrome55的大幅放大屏幕截图,在浏览器中以网站允许我选择的最小尺寸呈现字形。虽然乍一看它是对称的,但事实并非如此

其次,我下载了字体并在FontForge中打开了它。如果仔细观察,可以看到两侧内侧边缘上的曲线实际上略有不同。我还花了一点时间看了定义M底部中心的两个点。它们的位置是(848,0)和(985,0)。这两个点之间的中点为(916.5,0),但是定义此轮廓部分上边缘的两个点位于(920,256)和(928,256)。这将稍微向右移动


如果您正在寻找对称字体或其他简单字体,请寻找面向程序员的字体或控制台字体。Arial、Console、Courier New等可能非常符合要求。

这正是我在学习英语教程后要开始学习的内容。是的,他也使用FreeType,但不使用有符号的距离字段。“是的,他也使用FreeType,但不使用有符号的距离字段。”FreeType不生成“符号距离字段。它只是光栅化字形。我不清楚不对称的问题是什么,我知道我需要自己生成有符号的距离场。为此,我需要一个单色位图,我正试图使用FreeType为字体的每个字符生成该位图。不对称性的问题在于生成的字形似乎不准确,因为为什么我的“M”字符看起来像上面的图像,而不是基本上是左侧镜像的?几乎可以肯定的是,字形在指定分辨率下所选择的字体中的外观。您可以尝试调整一些暗示参数,但效果不会太强烈,无法使其看起来对称。尝试以更高的分辨率渲染并放大,看看它是否就是图示符的样子?这正是我在学习英语教程后要开始做的。是的,他使用Fre