FreeType文本颠倒

时间:2016-12-21 18:01:08

标签: c++ opengl

我正在开发一个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);

Picture of game with sprites and text

我在某处看到openGL和Freetype使用不同的坐标系是真的吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

然而,字形看起来是颠倒的,我的精灵是正确的方式。

这是因为你使用的不同于freetype。经典的OpenGL使用(0,0)作为 bottom 左边的纹理原点,而你使用它作为左上角。

因此,如果您希望能够使用相同的代码为freetype glyuphs和sprite生成顶点数据,则必须决定一个约定。

请注意,这些约定不算什么,(0,0)只是您输入} elseif ( false ) {的第一个纹素,如果它是顶部或底部完全取决于您。

答案 2 :(得分:0)

我最终只为字形生成了不同的uv,以便它们以正确的方式应用于四边形。

相关问题