C++ 使用FreeType(DirectX 11)绘制文本

C++ 使用FreeType(DirectX 11)绘制文本,c++,directx,directx-11,freetype,C++,Directx,Directx 11,Freetype,所以我想用FreeType(在DirectX 11上)绘制文本。问题是我真的不明白如何创建my_draw_位图函数(我遵循) 我得到所有的字形,然后将它们转换为位图,但我不知道如何将FT_位图*转换为ID3D11Texture2D*(理论上,这允许我渲染文本) 这是我的密码: FontLoader.cpp void FontLoader::RenderText(ID3D11Device* p_device, Text* p_text, Math::Vec2 p_position)

所以我想用FreeType(在DirectX 11上)绘制文本。问题是我真的不明白如何创建my_draw_位图函数(我遵循)

我得到所有的字形,然后将它们转换为位图,但我不知道如何将FT_位图*转换为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;
}
void FontLoader::RenderText(ID3D11Device*p_device,Text*p_Text,数学::Vec2 p_位置)
{
const char*text=p_text->GetText();
FT_Face=p_text->GetFont()->GetFace();
FT_字形槽=面->字形;
数学::Vec2笔=p_位置;
for(无符号整数i=0;i位图,数学::Vec2((浮点)插槽->位图_左,(浮点)插槽->位图_上));
//增量笔位
pen._x+=插槽->前进.x>>6;
}
}
ID3D11Texture2D*FontLoader::CreateTextureFromBitmap(ID3D11Device*p_device,FT_Bitmap*p_Bitmap,Math::Vec2 p_position)
{
D3D11_TEXTURE2D_DESC textureDesc;
textureDesc.Width=p_位图->宽度;
textureDesc.Height=p_位图->俯仰;
textureDesc.MipLevels=textureDesc.ArraySize=1;
textureDesc.Format=DXGI_格式_R8G8B8A8_UNORM;
textureDesc.SampleDesc.Count=1;
textureDesc.Usage=D3D11\u Usage\u DYNAMIC;
textureDesc.BindFlags=D3D11\u BIND\u SHADER\u资源;
textureDesc.CPUAccessFlags=D3D11\u CPU\u访问\u写入;
textureDesc.miscsflags=0;
ID3D11Texture2D*texture2D=NULL;
//不知道如何以及何时使用p_位图
p_设备->创建纹理2d(&textureDesc、NULL和&texture2D);
返回纹理2d;
}

非常感谢

调用
CreateTexture2D
时需要提供第二个参数,即
D3D11_SUBRESOURCE_DATA
包含指向具有FT位图数据的缓冲区的指针。请注意,您可能需要将FT位图数据复制到中间缓冲区<代码>textureDesc.Height=p_位图->俯仰是错误的,因为
螺距
不是高度。我做了一些更改,但现在当我尝试绘制文本时,最后一个字母被绘制了4次。。。这是我的代码,这是我最终设法修复它的结果,如果有人感兴趣,这是我的解决方案