访问 FreeType 位图像素的正确方法是什么?

问题描述 投票:0回答:0

我正在尝试创建一个我用 FreeType 渲染的字形纹理图集。我正在使用 stb_rect_pack 来获取图集中每个字形的位置。当我绘制 texture atlas 时,我似乎在错误地索引字形或图集。

// guesses an appropriate size of a square to pack glyphs in
float atlas_size = (sqrt(min_atlas_area) + 1) / avg_glyph_aspect_ratio;

std::vector<stbrp_node> nodes(atlas_size);
stbrp_init_target(&context, atlas_size, atlas_size, nodes.data(), nodes.size());
stbrp_pack_rects(&context, rects, NUM_VALID_CHARS);

std::vector<unsigned char> atlas_buffer(size_t(atlas_size) * atlas_size);
for (stbrp_rect& rect : rects)
{
    Glyph& glyph = *get(rect.id);
    for (int x = 0; x < glyph.size.x; x++)
    {
        for (int y = 0; y < glyph.size.y; y++)
        {
            atlas_buffer[rect.x + x + (rect.y + y) * atlas_size]
                       = glyph.pixels[int(x + y * glyph.size.x)];
        }
    }
}

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, atlas_size, atlas_size, 0, GL_RED, GL_UNSIGNED_BYTE, atlas_buffer.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
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);

在我的实现中,Glyph::size 是一个 glm::vec2,其中 x = 字形的宽度,y = 字形的行数

我尝试在行和列主要顺序之间切换并检查 FreeType 文档,但似乎都没有帮助。我检查了字形的间距/4 是否等于它的宽度。

c++ opengl graphics freetype
© www.soinside.com 2019 - 2024. All rights reserved.