モノクログリフアトラスを作成しようとしましたが、問題が発生しました。 Freetypeは、グリフのビットマップに「うんざり」を描画します。グリフのいくつかが正しくレンダリングされているので、私はfreetypeを責めます。Freetypeがビットマップでクラップをレンダリングする
たテクスチャアトラス:
なぜそれができると私はそれをどのように修正することができますか?
しかし、私はまだ間違っていると、ここでビットマップ処理コードである可能性があり:
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++;
}
}
うーむ、私は(私はそれがFreeTypeのではない賭ける –
...この特定のケースで使用する「がらくた」よりもっと良い言葉がありますかなり確信しているが、あなたのコード私はどこに見えないのか)。 –
は、固定されたストライドが仮定されているように見えます(グリフの幅はレンダリング幅とは無関係に常に8または4の倍数です)。観察される歪みは明らかにパディングの欠落によるものです。無傷のグリフがおそらくこの状態になることがあります。 – dlatikay