dx11 рендеринг на текстуру показывает только clearcolor - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать игровой вид для своего игрового движка, используя инфраструктуру Im Gui, однако, когда я пытаюсь визуализировать текстуру, на экране отображается только чистый цвет.

Мой план

  • Создание целевой текстуры рендеринга (я думаю, что я сделал эту часть правильно (я думаю))
  • Запись моей сцены в целевую текстуру (я предполагаю, что это то, где я потерпел неудачу, только чистый цвет отображается на экран, мой тестовый треугольник не отображается)
  • Создание представления ресурса шейдера (я протестировал этот и следующий шаг с помощью загрузки изображения с диска, здесь нет проблем)
  • Отображение на İm gui :: Image ()

При использовании текстуры рендеринга только четкого цвета и Im gui Элементы редактора, отображаемые на экране при возвращении к обычному рендерингу, показывают мой тестовый треугольник.

My Render Texture Creation

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;

Когда я использовать мою текстуру рендера и с Создайте представление ресурсов и используйте Im Gui :: Image, чтобы показать, что изображения нет, даже нет ясного цвета. Если я использую свое изображение на диске для Im Gui :: Image, оно отображает изображение. я делаю не так здесь

Вот мой им gui код

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

Я ценю каждый возможный ввод, спасибо

1 Ответ

0 голосов
/ 06 февраля 2020

Мне удалось решить проблему рендеринга треугольника, изменив 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.

...