提问人:zonn 提问时间:5/14/2015 最后编辑:zonn 更新时间:5/16/2015 访问量:352
FreeType 2 与 OpenGL
FreeType 2 with OpenGL
问:
我尝试将 FreeType2 与 OpenGL 一起使用,但我只能在写东西时写西班牙语交错标记。这是我加载所有字形的循环:
for(uint i = ' '; i <= '~'; i++)
{
FT_Glyph glyph;
u32 index = FT_Get_Char_Index(font->face, i);
if(FT_Load_Char(font->face, index, FT_LOAD_RENDER))
continue;
if(FT_Get_Glyph(font->face->glyph, &glyph))
continue;
if(font->face->glyph->format != FT_GLYPH_FORMAT_BITMAP && FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, NULL, 1))
continue;
u32 w = font->face->glyph->bitmap.width, h = font->face->glyph->bitmap.rows;
u8* px = (u8*) malloc(w * h * 4 * sizeof(u8));
if(!px)
{
ENG_AddError(ENGER_ALLOC);
end = &&END_ERR_0;
break;
}
for(uint y = 0; y < h; y++)
{
for(uint x = 0; x < w; x++)
{
for(u8 off = 0; off < 4; off++)
px[(x + y * w) * 4 + off] = font->face->glyph->bitmap.buffer[x + y * w];
}
}
u32 tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, px);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, 0);
FT_Done_Glyph(glyph);
free(px);
font->glyph_tex[i] = tex;
font->coord[i].x = w;
font->coord[i].y = h;
font->coord[i].w = font->face->glyph->advance.x >> 6;
font->coord[i].h = font->face->glyph->metrics.horiBearingY >> 6;
}
并显示:
uint len = strlen(str);
for(const char* ptr = str; len--; ptr++)
{
uint w = font->coord[(u32) *ptr].x;
uint h = font->coord[(u32) *ptr].y;
ENG_ArrayVertex px[] = { x, y, x + w, y, x + w, y + h, x, y, x, y + h, x + w, y + h };
ENG_ArrayTextureCoord texcoord[12];
texcoord[0] = 0.0;
texcoord[1] = 0.0;
texcoord[2] = 1.0;
texcoord[3] = 0.0;
texcoord[4] = 1.0;
texcoord[5] = 1.0;
texcoord[6] = 0.0;
texcoord[7] = 0.0;
texcoord[8] = 0.0;
texcoord[9] = 1.0;
texcoord[10] = 1.0;
texcoord[11] = 1.0;
ENG_VRAMAddr* addr = ENG_AllocVRAM(24 * sizeof(ENG_ArrayVertex), ENG_VRAM_UPDATE_RARELY);
ENG_VRAMUse(addr);
ENG_VRAMSend(ENG_ArrayVertex, 0, 12, px);
ENG_VRAMSend(ENG_ArrayVertex, 12 * sizeof(ENG_ArrayVertex), 12, texcoord);
ENG_VRAMUse(NULL);
ENG_VRAMFuncList* flist = ENG_AllocVRAMFuncList();
ENG_VRAMFuncListUse(flist);
ENG_VRAMUse(addr);
ENG_SetVRAMID(0, ENG_SHADER_ID_VERTEX, 2, px);
ENG_SetVRAMID(12 * sizeof(ENG_ArrayVertex), ENG_SHADER_ID_TEXTURE_COORD, 2, texcoord);
ENG_ArrayEnable(ENG_SHADER_ID_VERTEX);
ENG_ArrayEnable(ENG_SHADER_ID_TEXTURE_COORD);
glBindTexture(GL_TEXTURE_2D, font->glyph_tex[(u16) *ptr]);
ENG_ShaderUse(ENG_GetConfigShaderTexture(ENG_GetGlobConfig()));
ENG_ShaderSendMatrix(ENG_GetConfigShader(ENG_GetGlobConfig()), "scale", ENG_GetConfigMatrixOrtho(ENG_GetGlobConfig()));
ENG_ArrayDraw(ENG_ARRAY_DRAW_TRIANGLES, 0, 6);
ENG_ShaderUse(NULL);
ENG_VRAMFuncListUse(NULL);
ENG_VRAMUse(NULL);
ENG_FreeVRAMFuncList(flist);
ENG_FreeVRAM(addr);
x += w;
}
我在 Windows 8.1 上使用 C 语言(如果您知道我们制作便携式程序的方法,我宁愿)。
答: 暂无答案
评论