Directx11 绘制到错误的渲染目标

Directx11 drawing to wrong render target

我正在尝试渲染到纹理以用于 DirectX11 中的阴影映射。我已经设置并绑定了一个单独的渲染目标来绘制。问题是,在调用 OMSetRenderTargets 之后,它仍然渲染到先前绑定的渲染目标。

图形诊断事件列表显示正在调用 OMSetRenderTargets,将 "obj:30" 设置为渲染目标视图。但是,以下 DrawIndexed 调用将渲染目标显示为 "obj:17",这是之前绑定的渲染目标。

事件列表

绘图调用

我启用了 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
    }
}

在以下两个函数中有问题的调用

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

糟糕,我的错误,调试层实际上没有启用,错误是由于渲染目标与深度模板视图具有不同的尺寸引起的。抱歉!