Символ FreeType2, скопированный в d3dtexture, отображается в виде двойных букв

Недавно я только начал использовать библиотеку FreeType и начал пытаться копировать из буфера в текстуры DirectX9.

Однако в настоящее время я получаю двойные буквы, несмотря на то, что скопировал из буфера, созданного путем загрузки одного символа, следующим образом:

введите описание изображения здесь

[скопировать попытку символа «а»]

Вот мой текущий код:

void TexFont::freeTypeSave()
{
static FT_Library  library;   /* handle to library     */
static FT_Face     face;      /* handle to face object */

if (FT_Init_FreeType(&library)) {
NHelper::OutputDebugStringN("error");
}

if (FT_New_Face(library,TEXT("Fonts\\arial.ttf"),0,&face)) {
NHelper::OutputDebugStringN("font load failed\n");
}
else {
//NHelper::OutputDebugStringN("font faces: %d \n", face->num_faces);
}

static int error;
static UINT width, height;
static int mTtfSize = 64;
static int mTtfResolution = 96;

static IDirect3DTexture9* mTexture;
static unsigned int mPixelBytes = 2;
static unsigned int mDataSize = width * height * mPixelBytes;

// size settings (convert font size to *64)
FT_F26Dot6 ftSize = (FT_F26Dot6)(mTtfSize * (1 << 6));
error=FT_Set_Char_Size(face, ftSize, 0, mTtfResolution, mTtfResolution);

// load glyph + render
error = FT_Load_Char( face, L'a', FT_LOAD_RENDER );
if (error)
NHelper::OutputDebugStringN("could not load char");

// start copy procedure
width = face->glyph->bitmap.width;
height = face->glyph->bitmap.rows;

D3DXCreateTexture(
g_engine->getDevice(),
width, height,
1, 0,
D3DFMT_A8L8, D3DPOOL_MANAGED,
&mTexture);

D3DLOCKED_RECT lockedRect;
mTexture->LockRect(0, &lockedRect,0, 0);

unsigned char* pSrcPixels = face->glyph->bitmap.buffer;
unsigned char* pDestPixels = (unsigned char*)lockedRect.pBits;

for(UINT i = 0; i < height; ++i)
{
//copy a row
memcpy(pDestPixels, pSrcPixels, width * 2); //2 bytes per pixel (1byte alpha, 1byte greyscale)

//advance row pointers
pSrcPixels += face->glyph->bitmap.pitch;
pDestPixels += lockedRect.Pitch;
}
NHelper::OutputDebugStringN("char width: %d, height: %d \n", width, height);

mTexture->UnlockRect(0);

D3DXSaveTextureToFileA("test.png",D3DXIFF_PNG, mTexture, 0);

// release face
FT_Done_Face(face);

// library shutdown
FT_Done_FreeType(library);
}

Любые идеи о том, что происходит и как я мог бы исправить это?

Примечание: изменение размера шрифта просто создает увеличенное изображение. Я все еще получаю тот же результат.

—Обновить—

Пытаясь предложить Drop, я попытался изменить свой memcpy(pDestPixels, pSrcPixels, width * 2);

в memcpy(pDestPixels, pSrcPixels, width * 1); Возвращает следующее:

введите описание изображения здесь

Один символ упакован слева от изображения, но изображение осталось того же размера.
(глиф занимает только половину пространства изображения)

4

Решение

Вы загружаете символы как

FT_Load_Char( face, L'a', FT_LOAD_RENDER );

это означает тот

По умолчанию глиф отображается в FT_RENDER_MODE_NORMAL Режим

а также

FT_RENDER_MODE_NORMAL Это режим рендеринга по умолчанию; это соответствует 8-битным сглаженным растровым изображениям.

Но вы копируете как 16-битный

memcpy(pDestPixels, pSrcPixels, width * 2); //2 bytes per pixel (1byte alpha, 1byte greyscale)

Вам действительно не нужен компонент оттенков серого в любом символе для правильного рендеринга (вам просто нужно знать, нужно ли применять цвет к этому пикселю и сколько). Итак, сделайте все свои символы 8-битными масками при загрузке.
Затем преобразуйте в 32-битное изображение непосредственно перед рендерингом: примените свой цвет в RGB компоненты и установить маску как A составная часть. Я делаю это в шейдере.

Надеюсь, поможет. Удачного кодирования!

обновление 1

Из-за того, что сейчас вы копируете 8-битный источник, memcpy8 бит на пиксель, очевидно, вам также нужно изменить размер вашей цели (mTexture) быть одинаковыми битами на пиксель: D3DFMT_A8 (8 бит) вместо D3DFMT_A8L8 (8 + 8 = 16 бит).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]