IMGUI_DX11显示自定义图片

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));

	}

 

 

D3D9同理

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: cdrawbasic_dx11 是 Direct3D 11 绘图库的一个示例程序,报错可能是由于编译器或环境设置不正确导致的。你可以尝试以下步骤来解决这个问题: 1. 确保你的编译器支持 DirectX 11,并且已经正确安装了 DirectX SDK。 2. 检查项目的依赖项是否正确设置。例如,检查是否包含正确的头文件和库文件。 3. 确认编译器的链接选项是否正确。例如,检查是否正确链接了 DirectX 库文件。 4. 检查你的操作系统和硬件是否支持 DirectX 11。如果你的系统不支持 DirectX 11,则无法运行 Direct3D 11 应用程序。 希望这些建议能帮助你解决问题。如果问题仍然存在,请提供更多详细信息,以便我可以更好地帮助你。 ### 回答2: cdrawbasic_dx11报错可能是由于以下原因导致: 1. 缺少相关的依赖库或DLL文件:在使用cdrawbasic_dx11时,如果缺少必要的依赖库或DLL文件,可能会导致报错。解决方法是确保所需的依赖文件已正确安装,并在程序运行时可访问。 2. 驱动不符合要求:如果使用的图形驱动程序版本与cdrawbasic_dx11要求的驱动版本不兼容,可能会导致报错。解决方法是检查图形驱动程序的版本,并根据需要更新或升级驱动程序。 3. 编译或链接错误:如果在编译或链接cdrawbasic_dx11项目时出现错误,可能会导致报错。解决方法是再次检查项目配置、代码语法和项目设置,确保没有错误或遗漏。 4. 硬件不支持:如果使用的硬件不满足cdrawbasic_dx11的最低要求,可能会导致报错。解决方法是检查硬件设备的规格,并根据需要进行升级或更换硬件。 在解决cdrawbasic_dx11报错时,可以尝试逐个排查这些可能的原因,并根据具体情况采取相应的解决措施。如果无法解决报错,可以尝试搜索相关的错误信息或与相关技术人员沟通以获得更详细的帮助和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值