问题描述
我试图在另一个我自己创建的不是主后台缓冲区的纹理上正常渲染 imgui, 所以我创建了一个回调来在 imguis 绘制调用之间交换渲染目标。
这些是回调
ID3D11RenderTargetView* saved_rendertarget = nullptr;
ID3D11RenderTargetView* created_rendertarget = nullptr;
void CreateRenderCallback(const ImDrawList* parent_list,const ImDrawCmd* cmd)
{
g_pd3dDeviceContext->OMGetRenderTargets(1,&saved_rendertarget,nullptr);
g_pd3dDeviceContext->OMSetRenderTargets(1,&created_rendertarget,nullptr);
float clear[4] = { 0.0f,0.0f,0.0f };
g_pd3dDeviceContext->ClearRenderTargetView(created_rendertarget,clear);
}
void RestoreRenderCallback(const ImDrawList* parent_list,const ImDrawCmd* cmd)
{
g_pd3dDeviceContext->OMSetRenderTargets(1,nullptr);
}
我通过复制我用来创建主后台缓冲区和渲染目标的纹理和渲染目标来创建纹理和渲染目标,唯一的变化是我将其绑定到着色器资源,以便我可以在 imgui 中显示
纹理创建
ID3D11Texture2D* pBackBuffer;
g_pSwapChain->GetBuffer(0,IID_PPV_ARGS(&pBackBuffer));
pBackBuffer->GetDesc(&texture_desc);
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
ID3D11Texture2D* texture = nullptr;
HRESULT hr = g_pd3dDevice->CreateTexture2D(&texture_desc,nullptr,&texture);
渲染目标创建
D3D11_RENDER_TARGET_VIEW_DESC render_target_desc;
g_mainRenderTargetView->GetDesc(&render_target_desc);
hr = g_pd3dDevice->CreateRenderTargetView(texture,&render_target_desc,&created_rendertarget);
这些工作,我可以在创建着色器资源后进行渲染
auto drawlist = ImGui::GetForegroundDrawList();
drawlist->AddCallback(CreateRenderCallback,nullptr); //swaps my render target to the one i created
drawlist->AddRectFilled(ImVec2(0,0),ImVec2(400,400),IM_COL32(255,128));
drawlist->AddRectFilled(ImVec2(200,200),ImVec2(600,600),IM_COL32(0,255,128));
drawlist->AddCallback(RestoreRenderCallback,nullptr); //restores render target to the one made with my application at start
drawlist->AddImage(shader_resouce,ImVec2(0,ImVec2(1280,800));
最终产品应如下所示(在不交换渲染目标的情况下进行渲染)https://prnt.sc/zjkvac
颜色没有正确混合,这会让你认为这是一个混合状态问题,但唯一改变的是渲染目标,我从正确混合颜色的目标中复制了它。我应该在哪里解决这个问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)