当前位置: 首页 > 知识库问答 >
问题:

Directx11绘制到错误的渲染目标

宗政卓
2023-03-14

为了在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);
        }
    }
}

共有1个答案

徐洋
2023-03-14

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

 类似资料:
  • 我试图用DXUT11画一个简单的三角形,但是我在窗口中看不到三角形。 我努力工作,但仍然找不到问题所在-_- 我检查了D3D函数的每个返回值,它们都返回了S_OK<我可以看到我的窗口显示出来,背景色是我设置为清除窗口的颜色,因此看起来d3d设备是当前创建的,并且后缓冲区被渲染到窗口,但是黄色三角形在哪里 T\u T。。。。。。。。。。。。。。。 我的代码如下:(为了简化问题,我已经删除了所有的检查

  • 问题内容: 我正在使用Preact(出于所有意图和目的,React)来渲染保存在状态数组中的项目列表。每个项目旁边都有一个删除按钮。我的问题是:单击该按钮时,将删除正确的项目(我已对此进行了几次验证),但是重新渲染项目时缺少 最后一个 项目,并且删除的项目仍然存在。我的代码(简体): 我究竟做错了什么?我是否需要以某种方式主动重新渲染?这是n + 1种情况吗? 澄清 :我的问题不在于国家的同步性。

  • 如果你想渲染内置错误页面,你可以使用next/error: import React from 'react' import Error from 'next/error' import fetch from 'isomorphic-unfetch' export default class Page extends React.Component { static async getIni

  • 我是directx编程新手,所以我开始学习dx11的在线教程。我可以很好地初始化win32 window和directx11,但当我尝试绘制三角形时,会出现窗口,然后它会冻结我的电脑,所以我必须重新启动它。我一直在寻找解决办法,但没有任何帮助。 这是我的WinMain代码: <代码> 还有我的应用头和cpp: DXApp。h: DXApp。cpp: 谢谢你的帮助。

  • 我正在尝试根据设备宽度提供响应/自适应图像。 原始图像: 与Srcset: 我面临两个问题: 1)即使在较小的设备上(如iPhone 6s),也会加载宽度为2000px的图像(它应该加载800px图像)。 2)我已经把两个图像(有和没有srcset)放在一起。它们都加载了具有相同维度的图像。然而,与其他版本相比,带有srcset的版本显得较小。因为html/css中没有指定宽度,所以它应该以实际图

  • 我想用svg画一个模糊的圆,但是用一些更高的stdDeviation值,它会被裁剪。 我尝试了几个属性,比如“fegaussianblur”标签上的“edgemode”,或者“circle”和“filter”标签上的“width=”150%“和”height=“150%”,但没有任何帮助。 有什么想法吗?