gpt4 book ai didi

c++ - Freetype 在位图中呈现废话

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:23 25 4
gpt4 key购买 nike

我正在尝试创建单色字形图集,但遇到了问题。 Freetype 在字形的位图中呈现“废话”。我责怪 freetype,因为一些字形仍然正确呈现。

生成的纹理图集:

Texture atlas

为什么会这样,我该如何解决?

但是我仍然可能是错的,这里是位图处理代码:

static std::vector<unsigned char> generateBitmap(FT_Face &face, unsigned int glyph, size_t *width, size_t *height) {
FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_RENDER | FT_LOAD_MONOCHROME );

FT_Bitmap bitmap;
FT_Bitmap_New(&bitmap);
FT_Bitmap_Convert(ftLib, &face->glyph->bitmap, &bitmap, 1);
*width = bitmap.width;
*height = bitmap.rows;


std::vector<unsigned char> result(bitmap.width * bitmap.rows);//
for (size_t y = 0; y < bitmap.rows; ++y)
{
for (size_t x = 0; x < bitmap.width; ++x)
{
result[(bitmap.width * y) + x] = bitmap.buffer[(bitmap.width * y) + x];
}

}
FT_Bitmap_Done(ftLib, &bitmap);
return result;
}

以及将其放入主缓冲区的代码:

        static void putOnBuffer(std::vector<unsigned char> &buffer, std::vector<unsigned char> &bitmap, size_t height, size_t width) {
int r = 0;
while (r < height) {
int w = 0;
while (w < width) {
//assume buffer is enough large
size_t mainBufPos = ((currentBufferPositionY + r) * imageWidth) + (currentBufferPositionX + w);
size_t bitmapBufPos = (r * width) + w;
buffer[mainBufPos] = clamp(int(bitmap[bitmapBufPos] * 0x100), 0xff);
w++;
}
r++;
}
}

最佳答案

来自文档:

Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp to a bitmap object with depth 8bpp, making the number of used bytes [per] line (a.k.a. the ‘pitch’) a multiple of ‘alignment’.

在您的代码中,您在调用 FT_Bitmap_Convert 时将 1 作为 alignment 参数的值传递。在单色中,一个字节将是八个像素,因此水平渲染循环需要强制宽度为八的倍数。

引用:https://www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html

关于c++ - Freetype 在位图中呈现废话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533586/

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