IMGUI官方自带的例子里有一个Widgets项,里面有个Images
由于官方只演示了字体默认图片,并没有演示如何加载自定义图片
我们先搜索一下这个Images关键词
通过代码搜索,观察发现,这个纹理ID是画图的关键
ImTextureID my_tex_id = io.Fonts->TexID;
我们搜索看看io.Fonts->TexID是什么时候被赋值的(以下是Direct11的IMGUI)
观察得到流程为CreateTexture2D->CreateShaderResourceView->TexID
根据D3D11的相关知识,可以知道先创建一个2D纹理得到ID3D11Texture2D句柄,再通过CreateShaderResourceView得到ID3D11ShaderResourceView* g_pFontTextureView
即为纹理ID。
只要模拟这个过程就可以得到纹理ID:
ID3D11ShaderResourceView* DX11LoadTextureImageFromFile(ID3D11Device *pD3dDevice, wchar_t* lpszFilePath)
{
ID3D11Texture2D * pTexture2D = NULL;
D3D11_TEXTURE2D_DESC dec;
HRESULT result;
D3DX11_IMAGE_LOAD_INFO loadInfo;
ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO));
loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
loadInfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
loadInfo.MipLevels = D3DX11_DEFAULT; //这时会产生最大的mipmaps层。
loadInfo.MipFilter = D3DX11_FILTER_LINEAR;
result = D3DX11CreateTextureFromFile(pD3dDevice, lpszFilePath, &loadInfo, NULL, (ID3D11Resource**)(&pTexture2D), NULL);
pTexture2D->GetDesc(&dec);
if (result != S_OK)
{
return NULL;
}
ID3D11ShaderResourceView*pFontTextureView = NULL;
// Create texture view
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = dec.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
pD3dDevice->CreateShaderResourceView(pTexture2D, &srvDesc, &pFontTextureView);
return pFontTextureView;
}
调用例子:
if (ImGui::Begin(u8"IMGUI", false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize))
{
if (!m_pImageTextureView1)
{
m_pImageTextureView1 = DX11LoadTextureImageFromFile(GetD3dDevice(), (wchar_t*)L"D:\\1.jpg");
}
ImTextureID my_tex_id = m_pImageTextureView1;
float my_tex_w = (float)300;
float my_tex_h = (float)400;
ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0, 0), ImVec2(1, 1), ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f));
}