FreeType 2 与 OpenGL

FreeType 2 with OpenGL

提问人:zonn 提问时间:5/14/2015 最后编辑:zonn 更新时间:5/16/2015 访问量:352

问:

我尝试将 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 语言(如果您知道我们制作便携式程序的方法,我宁愿)。

c opengl 自由类型 glteximage2d

评论

0赞 Klathzazt 5/16/2015
您可能有兴趣使用此库: code.google.com/p/freetype-gl
0赞 zonn 5/21/2015
谢谢,它看起来是一个很好的库,但是你现在我如何获得 mingw 版本,因为我从未尝试编译过任何库?
0赞 zonn 5/27/2015
我巧妙地发现,只需替换一个函数:FT_Load_Char -> FT_Load_Glyph

答: 暂无答案