【问题标题】:Rendering to multiple textures with one pass in directx 11在directx 11中一次渲染到多个纹理
【发布时间】:2012-09-25 16:03:04
【问题描述】:

我正在尝试使用 C++ directx 11 SDK 一次性渲染两个纹理。我想要一个纹理包含结果图像的每个像素的颜色(我通常在渲染 3D 场景时在屏幕上看到的颜色),另一个纹理包含每个像素和深度的法线(3 个浮点表示正常,1 个浮点表示深度)。现在,我能想到的是创建两个渲染目标,并将第一遍渲染为颜色,第二遍将法线和深度分别传递给每个渲染目标。但是,这似乎是在浪费时间,因为我可以在第一遍中获得每个像素的颜色、法线和深度的信息。那么有没有办法用像素着色器以某种方式输出两个纹理?

任何帮助将不胜感激。

附:我正在考虑像素着色器中的 RWTexture2D 或 RWStructuredBuffer 。一点背景知识:我需要这两个图像在计算着色器中进行进一步处理。这带来了同步的一个附带问题:由于像素着色器(与计算着色器不同)一次写入每个像素,我怎么知道像素着色器何时完成并告诉计算着色器开始图像后处理?

【问题讨论】:

    标签: directx-11 pixel-shader render-to-texture compute-shader


    【解决方案1】:

    您需要使用 MRT (Multiple Render Targets) 一次性渲染此内容。

    您可以使用 OMSetRenderTargets 将两个目标绑定为输出

    http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx

    http://hieroglyph3.codeplex.com/ (DefferedRendering) 中有一个示例,它展示了如何同时写入两个纹理。

    这是一个小样本:

    ID3D11DeviceContext* deviceContext; //Your immediate context
    
    ID3D11RenderTargetView* m_pRenderViews[2]; //Not more than D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT (8)
    m_pRenderViews[0] = pRTV1; //First target
    m_pRenderViews[1] = pRTV2; //second target
    
    deviceContext->OMSetRenderTargets(2, &m_pRenderViews[0], NULL); //NULL means no depth stencil attached
    

    那么你的像素着色器将需要输出一个结构而不是单一颜色:

    struct PS_OUTPUT
    {
        float4 Color: SV_Target0;
        float4 Normal: SV_Target1;
    };
    
    PS_OUTPUT PS(float4 p: SV_Position, float2 uv : TEXCOORD0)
    {
          PS_OUTPUT output;
          output.Color = //Set first output
          output.Normal= //Set second output
          return output;
    }
    

    同样在 DirectX11 中,您不需要将深度写入普通缓冲区,只需使用深度缓冲区即可。

    对于像素/计算着色器同步,您不能在同一设备上同时运行像素着色器和计算着色器,因此当您的绘制调用完成后,纹理就可以在计算中用于调度了。

    【讨论】:

    • 谢谢。特别是对于链接。你无法想象这些有多大帮助。再次感谢。顺便说一句,“深度缓冲区”是指像素着色器的 SV_Depth 值? (我想我在某处读过这篇文章,但我不太确定。)+1 并接受了答案。
    • 没有问题。 SV_Depth 如果您想编写自己的深度值,它在某些情况下很有用(来自 PixelShader 光线跟踪器的深度,或一些纹理阵列摆弄)。我的意思是 DepthStencil 资源也可以绑定为 Shader Resource View,因此由于您还将将深度缓冲区绑定到您的场景,您不妨重复使用它,它是免费的)
    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多