Рисование текста с помощью FreeType (DirectX 11)

Поэтому я хотел бы рисовать текст с помощью FreeType (на DirectX 11). Проблема в том, что я не совсем понимаю, как создать функцию my_draw_bitmap (я следую это руководство).

Я получаю все глифы, а затем преобразовываю их в растровые изображения, но я не вижу, как преобразовать FT_Bitmap* в ID3D11Texture2D* (теоретически это позволит мне отображать текст)

Вот мой код:

FontLoader.cpp

    void FontLoader::RenderText(ID3D11Device* p_device, Text* p_text, Math::Vec2 p_position)
    {
    const char* text = p_text->GetText();

    FT_Face face = p_text->GetFont()->GetFace();
    FT_GlyphSlot slot = face->glyph;

    Math::Vec2 pen = p_position;

    for (unsigned int i = 0; i < strlen(text); ++i)
    {
        if (FT_Load_Char(face, text[i], FT_LOAD_RENDER))
            continue;

        // draw to our target surface
        CreateTextureFromBitmap(p_device, &slot->bitmap, Math::Vec2((float)slot->bitmap_left, (float)slot->bitmap_top));

        // Increment pen position
        pen._x += slot->advance.x >> 6;
    }
}

ID3D11Texture2D* FontLoader::CreateTextureFromBitmap(ID3D11Device* p_device, FT_Bitmap* p_bitmap, Math::Vec2 p_position)
{
    D3D11_TEXTURE2D_DESC textureDesc;
    textureDesc.Width = p_bitmap->width;
    textureDesc.Height = p_bitmap->pitch;
    textureDesc.MipLevels = textureDesc.ArraySize = 1;
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    textureDesc.SampleDesc.Count = 1;
    textureDesc.Usage = D3D11_USAGE_DYNAMIC;
    textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    textureDesc.MiscFlags = 0;

    ID3D11Texture2D *texture2D = NULL;
    // don't know how and when to use p_bitmap
    p_device->CreateTexture2D(&textureDesc, NULL, &texture2D);

    return texture2D;
}

Большое спасибо !


person aqwerty    schedule 26.04.2018    source источник
comment
Вам необходимо указать второй параметр при вызове CreateTexture2D, то есть D3D11_SUBRESOURCE_DATA, содержащий указатель на буфер с данными растрового изображения FT. Обратите внимание, что вам может понадобиться скопировать данные FT Bitmap в промежуточный буфер. textureDesc.Height = p_bitmap->pitch; неверно, потому что pitch это не рост.   -  person user7860670    schedule 26.04.2018
comment
Я кое-что изменил, но теперь, когда я пытаюсь нарисовать текст, последняя буква рисуется 4 раза... Вот мой код ссылка   -  person aqwerty    schedule 30.04.2018
comment
И вот результат ссылка   -  person aqwerty    schedule 30.04.2018
comment
Наконец-то мне удалось это исправить, вот мое решение, если кому интересно   -  person aqwerty    schedule 21.05.2018