c++graphicsdirectxdirectx-11render-to-texture

Directx11 drawing to wrong render target


I'm attempting to render to a texture for the purpose of shadow mapping in DirectX11. I've set up and bound a separate render target to draw to. Problem is, after calling OMSetRenderTargets it's still rendering to the previously bound render target.

The graphics diagnostics event list shows that OMSetRenderTargets is being called, setting "obj:30" as the render target view. However, the following DrawIndexed call shows the render target as "obj:17", which is the previously bound render target.

Event List

enter image description here

Draw Call

enter image description here

I have the DirectX debug layer enabled, however it does not show any errors or warning messages. I've also ensured that the texture is not bound as a shader resource when the draw call happens but no luck there either.

These are both called by the following function

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
    }
}

with the problematic calls to that being in the following two functions

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

Solution

  • Woops my mistake, the debug layer actually wasn't enabled, the error was caused by the render target having different dimensions to the depth stencil view. Apologies!