gpt4 book ai didi

c++ - 呈现 FreeType 字体

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:56 24 4
gpt4 key购买 nike

我一直在尝试在 OpenGL 3 中渲染 FreeType2 字体。我使用了 NeHe 的教程 http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/ .但是,我针对现代 OpenGL 3+ 对其进行了一些修改。实际上,我使用 glBufferData(...,GL_DYNAMIC_DRAW) 来更新每个字符的顶点缓冲区。顶点数组是在字形加载期间创建的,就像 NeHe 对显示列表所做的那样:

    int width = next_p2(bitmap.width);
int height = next_p2(bitmap.rows);

float x=(float)bitmap.width / (float)width,
y= (float)bitmap.rows / (float)height;


using namespace glm;
glyphsVertices[c] = new pxgVertex2dT[4];
glyphsVertices[c][0] = { vec2(0,bitmap.rows), vec2(0,y) };
glyphsVertices[c][1] = { vec2(0,0), vec2(0,0) };
glyphsVertices[c][2] = { vec2(bitmap.width,0), vec2(x,0) };
glyphsVertices[c][3] = { vec2(bitmap.width,bitmap.rows), vec2(x,y) };

其中 glyphVertices 是这种结构的二维数组:

   struct Vertex2dT
{
glm::vec2 pos;
glm::vec2 texCoord;
};

不幸的是,我得到以下结果:

Code Result

那么,我做错了什么?

最佳答案

正如 SAKrisT 正确指出的那样,问题是由 Y 轴的不正确偏移引起的。稍微研究一下代码,我找到了解决方案:

   if(FT_Load_Char(face, c, FT_LOAD_RENDER))
return;

FT_GlyphSlot g = face->glyph;

int width = next_p2(g->bitmap.width);
int height = next_p2(g->bitmap.rows);

...

float x=(float)g->bitmap.width / (float)width,
y= (float)g->bitmap.rows / (float)height;



float x2 = g->bitmap_left;
float y2 = g->bitmap_top;
float w = g->bitmap.width;
float h = g->bitmap.rows;


using namespace glm;
glyphsVertices[c] = new pxgVertex2dT[4];
glyphsVertices[c][0] = { vec2(0,h-y2), vec2(0,y) };
glyphsVertices[c][1] = { vec2(0,-y2), vec2(0,0) };
glyphsVertices[c][2] = { vec2(w,-y2), vec2(x,0) };
glyphsVertices[c][3] = { vec2(w,h-y2), vec2(x,y) };

现在它完美运行了!

关于c++ - 呈现 FreeType 字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22868070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com