Рисование Directx11 с неверной целью рендеринга - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь выполнить рендеринг в текстуру с целью отображения теней в DirectX11. Я установил и привязал отдельную цель рендеринга для рисования. Проблема в том, что после вызова OMSetRenderTargets он все еще рендерится до ранее связанной цели рендеринга.

Список событий диагностики графики показывает, что вызывается OMSetRenderTargets, устанавливая «obj: 30» в качестве целевого представления рендеринга. Однако следующий вызов DrawIndexed показывает цель рендеринга как «obj: 17», которая является ранее связанной целью рендеринга.

Список событий

enter image description here

Draw Call

enter image description here

У меня включен уровень отладки DirectX, однако он не отображает никаких ошибок или предупреждений. Я также позаботился о том, чтобы текстура не была привязана как ресурс шейдера, когда происходит вызов отрисовки, но и не повезло.

Обе они вызываются следующей функцией

void GraphicsHandler::DrawSceneToRenderTarget(ID3D11RenderTargetView* RenderTarget, ID3D11VertexShader* WithVertexShader, ID3D11PixelShader* WithPixelShader)
{
    const unsigned int VertexSize = sizeof(Vertex);
    const unsigned int Offset = 0;
    DeviceContext->ClearDepthStencilView(DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0.0f);
    DeviceContext->VSSetShader(WithVertexShader, nullptr, 0);
    DeviceContext->PSSetShader(WithPixelShader, nullptr, 0); 
    DeviceContext->OMSetRenderTargets(1, &RenderTarget, DepthStencilView); //Render target set here
    for (auto& Obj : ActiveScene.Objects)
    {
        ObjectInfo ObjectData;
        ObjectData.ObjectTransform = XMMatrixIdentity();
        ObjectData.ObjectTransform *= XMMatrixRotationRollPitchYaw(Obj->Rotator.X, Obj->Rotator.Y, Obj->Rotator.Z);
        ObjectData.ObjectTransform *= XMMatrixTranslation(Obj->Position.X, Obj->Position.Y, Obj->Position.Z);
        ObjectData.ObjectTransform *= XMMatrixScaling(Obj->Scale.X, Obj->Scale.Y, Obj->Scale.Z);
        ObjectData.NormalMatrix = XMMatrixTranspose(XMMatrixInverse(nullptr, ObjectData.ObjectTransform));

        DeviceContext->UpdateSubresource(ObjectBuffer, 0, nullptr, &ObjectData, 0, 0);
        DeviceContext->UpdateSubresource(MaterialBuffer, 0, nullptr, &Obj->Mat, 0, 0);

        DeviceContext->IASetVertexBuffers(0, 1, &Obj->VertexBuffer, &VertexSize, &Offset);
        DeviceContext->IASetIndexBuffer(Obj->IndexBuffer, DXGI_FORMAT_R16_UINT, 0);

        DeviceContext->VSSetConstantBuffers(0, 1, &ObjectBuffer);
        //DeviceContext->PSSetConstantBuffers(0, 1, &MaterialBuffer);

        DeviceContext->DrawIndexed(Obj->Indices.size(), 0, 0); //Draw called here
    }
}

с проблемными c вызовами этой функции в следующих двух функциях

void GraphicsHandler::RenderSceneDepth()
{
    DeviceContext->RSSetState(RasterizerState);
    DeviceContext->PSSetShaderResources(0, 1, &SceneDepthSRV);
    DeviceContext->UpdateSubresource(CameraBuffer, 0, nullptr, &ActiveScene.SceneCamera.GetCameraVSInfo(), 0, 0);
    DeviceContext->VSSetConstantBuffers(1, 1, &CameraBuffer);
    DeviceContext->ClearRenderTargetView(SceneDepthRTV, Colors::Black);
    DrawSceneToRenderTarget(SceneDepthRTV, VertexShader, DepthShader);
}

void GraphicsHandler::RenderShadowMap(ShadowMap& SM)
{
    //Clear shader resources, as the texture can't be bound as input and output
    ID3D11ShaderResourceView* NullResources[2] = { nullptr, nullptr };
    DeviceContext->PSSetShaderResources(0, 2, NullResources);

    DeviceContext->RSSetState(SMRasterizerState); //Need to render back faces only
    ID3D11SamplerState* Samplers[2] = { SamplerState, ShadowSamplerState };
    DeviceContext->PSSetSamplers(0, 2, Samplers);


    //If the light is a directional source, render a directional shadow map
    DirectionalLight* DirLight = nullptr;
    DirLight = dynamic_cast<DirectionalLight*>(SM.ParentLight);
    if (DirLight)
    {
        ID3D11RenderTargetView* RTV = SM.RTVs[0];
        SM.LightPovCamera.ForwardDirection = DirLight->Direction;
        DeviceContext->ClearRenderTargetView(RTV, Colors::Black);
        DeviceContext->UpdateSubresource(LightPovBuffer, 0, nullptr, &SM.LightPovCamera.GetCameraVSInfo(), 0, 0);
        DeviceContext->VSSetConstantBuffers(1, 1, &LightPovBuffer);
        DrawSceneToRenderTarget(RTV, VertexShader, DepthShader);
    }

    //Otherwise, render to each face of the texturecube
    else
    {
        for (int N = 0; N < 6; N++)
        {
            DeviceContext->ClearRenderTargetView(SM.RTVs[N], Colors::Black);
            Camera POVCam = SM.GetCameraForCubemapFace(N);
            DeviceContext->UpdateSubresource(LightPovBuffer, 0, nullptr, &POVCam.GetCameraVSInfo(), 0, 0);
            DeviceContext->VSSetConstantBuffers(1, 1, &LightPovBuffer);
            DrawSceneToRenderTarget(SM.RTVs[N], VertexShader, DepthShader);
        }
    }
}

1 Ответ

0 голосов
/ 14 января 2020

Ошибка допущена, слой отладки фактически не был включен, ошибка была вызвана тем, что цель рендеринга имела разные размеры, чем представление трафарета глубины. Извиняюсь!

...