我正在做一个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使用不同的坐标系,是真的吗?
4条答案
按热度按时间kupeojn61#
然而,象形文字似乎是颠倒的,我的精灵是正确的方式向上。
这是因为您使用的约定与freetype不同。经典OpenGL使用(0,0)作为纹理的 * 下 * 左原点,而您将其用作左上角。
因此,如果您希望能够使用相同的代码来生成freetype字形和您的精灵的顶点数据,您必须决定一个约定。
请注意,这些约定没有任何意义,(0,0)只是你输入
glTexImage
的第一个纹理元素,如果是顶部还是底部完全取决于你。e4eetjau2#
我最终只是为字形生成不同的UV,以便它们以正确的方式应用到四边形上。
mnemlml83#
我只是遇到了同样的问题,经过一番调查
我认为这是因为Freetype使用的内存布局与常见图像格式的内存布局不一样。
所以只有两个解决方案:
1.为角色应用不同的uv坐标。
1.翻转角色的记忆。
更多详情
使用以下函数打印自由字体位图。
字符集
您将看到一个精确的字符图像,其记忆从左上角开始,与图像的原点不一致。(此角色图像的原点应位于左下方。)
例如,“W”的输出如下:
型
另一方面,如果使用任何一种十六进制查看器来查看未压缩图片(如BMP图片)的内存,您会发现内存的起始点与Image原点一致。
quhf5bfb4#
这些字体实际上是绘制在矩形上的纹理,矩形由两个三角形组成。你需要通过矩阵乘法来旋转它们。这是你应该开始学习的基本OpenGL工作。