繁体   English   中英

dx11 渲染到纹理仅显示 clearcolor

[英]dx11 Rendering to texture shows only clearcolor

我尝试使用 ImGui 框架为我的游戏引擎创建游戏视图,但是当我尝试渲染纹理时,屏幕上只显示清晰的颜色。

我的计划

  • 创建渲染目标纹理(我认为我做对了这部分(我认为))
  • 将我的场景写入目标纹理(我认为这是我失败的地方,屏幕上只显示清晰的颜色,未显示我的测试三角形)
  • 创建着色器资源视图(我通过从磁盘加载图像测试了这个和下一步,这里没有问题)
  • 在 İmgui::Image() 上显示它

当设置回正常渲染时,使用渲染纹理仅在屏幕上显示清晰的颜色和 Imgui Editor 元素,我的测试三角形出现在屏幕上。

我的渲染纹理创建

D3D11_TEXTURE2D_DESC textureDesc;
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;

ZeroMemory(&textureDesc, sizeof(textureDesc));
textureDesc.Width = 1920;
textureDesc.Height = 1080;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
textureDesc.SampleDesc.Count = 1;
textureDesc.SampleDesc.Quality = 0;

renderTargetViewDesc.Format = textureDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;

DLE_Graphics::CurrentGraphics->pDevice->CreateTexture2D(&textureDesc, NULL, pTargetTexture.GetAddressOf());


shaderResourceViewDesc.Format = textureDesc.Format;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;

DLE_Graphics::CurrentGraphics->pDevice->CreateShaderResourceView(this->pTargetTexture.Get(), &shaderResourceViewDesc, this->pResourceView.GetAddressOf());

// (re)-create the render target view
DLE_Graphics::CurrentGraphics->pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(pTargetTexture.GetAddressOf()));
DLE_Graphics::CurrentGraphics->pDevice->CreateRenderTargetView(pTargetTexture.Get(), &renderTargetViewDesc, pRenderTargetView.GetAddressOf());



// create the depth and stencil buffer
D3D11_TEXTURE2D_DESC dsd;
pTargetTexture->GetDesc(&dsd);
dsd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
dsd.Usage = D3D11_USAGE_DEFAULT;
dsd.BindFlags = D3D11_BIND_DEPTH_STENCIL;

DLE_Graphics::CurrentGraphics->pDevice->CreateTexture2D(&dsd, NULL, pDepthTexture.GetAddressOf());
DLE_Graphics::CurrentGraphics->pDevice->CreateDepthStencilView(pDepthTexture.Get(), NULL, pDepthView.GetAddressOf());

// activate the depth and stencil buffer
DLE_Graphics::CurrentGraphics->pContext->OMSetRenderTargets(1, pRenderTargetView.GetAddressOf(), pDepthView.Get());

我的渲染代码

const FLOAT clr[] = { 0.0f, 0.5f, 0.5f, 0.0f };
    pContext->ClearRenderTargetView(pRenderTexture->GetRenderView().Get(), clr);
    pContext->ClearDepthStencilView(pRenderTexture->GetDepthView().Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0u, 0u);
    pContext->OMSetRenderTargets(1u, pRenderTexture->GetRenderView().GetAddressOf(), pRenderTexture->GetDepthView().Get());
    pContext->DrawIndexed(size, 0u, 0u);

    pSwapChain->Present(0u, 0u);

如果有人好奇,这是我的交换链描述

DXGI_SWAP_CHAIN_DESC description = {};
    description.BufferDesc.Width = 1920;
    description.BufferDesc.Height = 1080;
    description.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    description.BufferDesc.RefreshRate.Numerator = 60;
    description.BufferDesc.RefreshRate.Denominator = 1;
    description.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    description.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    description.SampleDesc.Count = 1;
    description.SampleDesc.Quality = 0;
    description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT ;
    description.BufferCount = 1;
    description.OutputWindow = hWnd;
    description.Windowed = TRUE;
    description.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    description.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

当我使用渲染纹理并创建资源视图并使用 ImGui::Image 显示没有图像时,甚至没有清晰的颜色。如果我使用磁盘上的图像作为 ImGui::Image 它显示图像,我不我在这里做错了什么

这是我的 imgui 代码

ImGui::Begin("Spectrum Observer");
    ImVec2 pos = ImGui::GetCursorScreenPos();
    //ImGui::Image(texture->GetResource(), ImVec2(512, 512)); // my image from the disk
    ImGui::Image(pGraphics->pRenderTexture->GetResourceView().Get(), ImVec2(512, 512)); // render texture 
    ImGui::End();
    ImGui::Render();
    ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());

我感谢每一个可能的输入,谢谢

我设法通过将 ClearDepthStencilView() 0u 更改为 1u 来解决三角形渲染问题

const FLOAT clr[] = { 0.0f, 0.5f, 0.5f, 0.0f };
    pContext->ClearRenderTargetView(pRenderTexture->GetRenderView().Get(), clr);
    pContext->ClearDepthStencilView(pRenderTexture->GetDepthView().Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1u, 0u);
    pContext->OMSetRenderTargets(1u, pRenderTexture->GetRenderView().GetAddressOf(), pRenderTexture->GetDepthView().Get());
    pContext->DrawIndexed(size, 0u, 0u);

    pSwapChain->Present(0u, 0u);

显然我正在将深度缓冲区清除为 0,这表明所有深度值最接近可能导致 ztest 失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM