opengl FreeType文本倒置

sqxo8psd  于 2023-08-04  发布在  其他
关注(0)|答案(4)|浏览(166)

我正在做一个OpenGL和C++项目(一个小的2D游戏),我目前正在实现字体渲染。我正在使用FreeType处理字体文件和字形,我已经成功地(有点)渲染到屏幕上的字形。然而,象形文字似乎是颠倒的,我的精灵是正确的方式向上。
一个精灵的纹理坐标(这些进入vbo,然后进入vao)

vec2 uv_topLeft(0.0, 0.0);
vec2 uv_topRight(1.0, 0.0);
vec2 uv_bottomRight(1.0, 1.0);
vec2 uv_bottomLeft(0.0, 1.0);

uvs.push_back(uv_topLeft);
uvs.push_back(uv_bottomLeft);
uvs.push_back(uv_bottomRight);
uvs.push_back(uv_bottomRight);
uvs.push_back(uv_topRight);
uvs.push_back(uv_topLeft);

字符集
我只有一个投影矩阵,我用它来把顶点的位置转换成NDC坐标。
投影矩阵:(WINDOW_WIDTH = 960,WINDOW_HEIGHT = 640)
glm::ortho(0.0,(double)WINDOW_WIDTH,0.0,(double)WINDOW_HEIGHT);


的数据
我看到openGL和Freetype使用不同的坐标系,是真的吗?

kupeojn6

kupeojn61#

然而,象形文字似乎是颠倒的,我的精灵是正确的方式向上。
这是因为您使用的约定与freetype不同。经典OpenGL使用(0,0)作为纹理的 * 下 * 左原点,而您将其用作左上角。
因此,如果您希望能够使用相同的代码来生成freetype字形和您的精灵的顶点数据,您必须决定一个约定。
请注意,这些约定没有任何意义,(0,0)只是你输入glTexImage的第一个纹理元素,如果是顶部还是底部完全取决于你。

e4eetjau

e4eetjau2#

我最终只是为字形生成不同的UV,以便它们以正确的方式应用到四边形上。

mnemlml8

mnemlml83#

我只是遇到了同样的问题,经过一番调查
我认为这是因为Freetype使用的内存布局与常见图像格式的内存布局不一样。
所以只有两个解决方案:
1.为角色应用不同的uv坐标。
1.翻转角色的记忆。

更多详情

使用以下函数打印自由字体位图。

#include <iostream>
#include <iomanip>
using namespace std;

...

void print_FT_Bitmap(FT_Face face){
    int r = face->glyph->bitmap.rows;
    int w = face->glyph->bitmap.width;

    for(int i = 0; i<r*w; i++){
        cout<< setw(2) << setfill('0') << hex << int(face->glyph->bitmap.buffer[i]);

        if(i!=0 && (i+1)%w==0){
            cout << "\n";
        }
    }
}

...

字符集
您将看到一个精确的字符图像,其记忆从左上角开始,与图像的原点不一致。(此角色图像的原点应位于左下方。)
例如,“W”的输出如下:

i=0 is here
↓
49fff704000000000090ffbb000000000000c9ff51
14ffff2c0000000000cffff5060000000003f6ff1d
00dfff5c0000000010fdffff3b000000002cffea00
00aaff8d000000004dffb0ff7b000000005effb600
0075ffbd000000008dff44ffbb0000000090ff8300
0040ffee00000000ccf001e6f606000000c2ff4f00
000dfdff1f00000efcbb00b1ff3b000001f2ff1c00
0000d6ff4f00004aff830078ff7b000025ffe90000
0000a1ff8000008aff450039ffbb000057ffb40000
00006bffb10000c9fb0c0005f5f6060089ff810000
000036ffdf0008fac9000000bcff3500b5ff4d0000
000007fafe0d38ff8c0000007dff6b00deff1a0000
000000ccff396eff4e0000003effa109fee7000000
00000097ff67a4fe1200000007f7d731ffb3000000
00000062ff94dad30000000000c0fe6aff7f000000
0000002dffd7ff95000000000081ffceff4c000000
00000003f4ffff57000000000042ffffff19000000
00000000c2ffff1a000000000009f9ffe500000000
↑
Image origin is here


另一方面,如果使用任何一种十六进制查看器来查看未压缩图片(如BMP图片)的内存,您会发现内存的起始点与Image原点一致。

quhf5bfb

quhf5bfb4#

这些字体实际上是绘制在矩形上的纹理,矩形由两个三角形组成。你需要通过矩阵乘法来旋转它们。这是你应该开始学习的基本OpenGL工作。

相关问题