Ich versuche, einen monochromen Glyphatlas zu erstellen, stieß aber auf ein Problem. Freetype macht "Mist" in der Bitmap der Glyphe. Ich beschuldige Freetype, weil einige der Glyphen immer noch korrekt gerendert werden.Freetype rendert Mist in Bitmap
Der resultierende Texturatlas:
Warum könnte es sein und wie kann ich es beheben?
aber ich immer noch falsch sein könnte und hier ist Bitmap-Verarbeitungscode:
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;
}
Und Code für sie auf Hauptpuffer setzen:
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++;
}
}
Hmmmm, ich bin ziemlich sicher, dass ein besseres Wort als ‚Mist‘ gibt es in diesem speziellen Fall verwendet werden ... –
ich es Freetype ist nicht wette, aber Ihr Code (aber ich kann nicht sehen wo). –
sieht aus, als ob ein fester Schritt angenommen wird (also sind die Breiten von Glyphen immer ein Vielfaches von wie 8 oder 4 unabhängig von der Renderbreite), da die beobachtete Verzerrung offensichtlich auf fehlendes Padding zurückzuführen ist. die intakten Glyphen erfüllen wahrscheinlich diese Bedingung. – dlatikay