4

私は最近、FreeType ライブラリの使用を開始したばかりで、バッファから directx9 テクスチャへのコピーを試み始めました。

私は現在、単一の文字を読み込んで作成されたバッファからコピーしたにもかかわらず、二重の文字が表示されています:

ここに画像の説明を入力

[文字「a」のコピー試行]

以下は私の現在のコードです:

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);返します。

ここに画像の説明を入力

1 つのグリフが画像の左側に詰め込まれていますが、画像は同じサイズのままです。(グリフは画像スペースの半分しか占有しません)

4

1 に答える 1

1

文字を次のようにロードします

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 ビットのソースをコピーしているため、ピクセルあたり 8 ビットを使用していmemcpyます。明らかに、ターゲット ( mTexture) のサイズを変更して、ピクセルあたりのビットを同じにする必要があります: ( 8 + 8 = 16 ビットD3DFMT_A8) ではなく(8 ビット)。D3DFMT_A8L8

于 2013-05-12T16:30:56.280 に答える