Sharpdx - 使用MRT(多个渲染目标)时Depthstencil无法正常工作

时间:2015-02-05 09:23:34

标签: c# directx rendering directx-11 sharpdx

一直在尝试更改我从SlimDX写到SharpDX的渲染器并遇到了问题。我想渲染到多个渲染目标(在这种情况下,颜色和对象ID用于拾取)

这是rendertargets的初始化(所有具有相同的维度和多重采样设置)

        //Swapchain, Device, Primary Rendertarget
        var description = new SwapChainDescription()
        {
            BufferCount = 1,
            Usage = Usage.RenderTargetOutput,
            OutputHandle = Form.Handle,
            IsWindowed = true,
            ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
            SampleDescription = new SampleDescription(1, 0),
            Flags = SwapChainFlags.AllowModeSwitch,
            SwapEffect = SwapEffect.Discard
        };

        this.Device = new Device(adapter);
        this.SwapChain = new SwapChain(factory, Device, description);

        this.backBuffer = SharpDX.Direct3D11.Texture2D.FromSwapChain<SharpDX.Direct3D11.Texture2D>(SwapChain, 0);
        this.RenderTargetView = new RenderTargetView(Device, backBuffer);

        //Depthbuffer
        Texture2DDescription descDepth = new Texture2DDescription();
        descDepth.Width = (int)Viewport.Width;
        descDepth.Height = (int)Viewport.Height;
        descDepth.MipLevels = 1;
        descDepth.ArraySize = 1;
        descDepth.Format = Format.D32_Float;
        descDepth.Usage = ResourceUsage.Default;
        descDepth.SampleDescription = new SampleDescription(1, 0);
        descDepth.BindFlags = BindFlags.DepthStencil;
        descDepth.CpuAccessFlags = 0;
        descDepth.OptionFlags = 0;

        using (Texture2D depthStencil = new Texture2D(Device, descDepth))
        {
            depthView = new DepthStencilView(Device, depthStencil);
        }

        //Rendertargetview for the ID
        Texture2DDescription IdMapDesc = new Texture2DDescription();
        IdMapDesc.Width = (int)Viewport.Width;
        IdMapDesc.Height = (int)Viewport.Height;
        IdMapDesc.ArraySize = 1;
        IdMapDesc.MipLevels = 1;
        IdMapDesc.Format = Format.R16_UInt;
        IdMapDesc.Usage = ResourceUsage.Default;
        IdMapDesc.SampleDescription = new SampleDescription(1, 0);
        IdMapDesc.BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget;
        IdMapDesc.CpuAccessFlags = 0;
        IdMapDesc.OptionFlags = 0;

        using (Texture2D idMap = new Texture2D(Device, IdMapDesc))
        {
            idView = new RenderTargetView(Device, idMap);
        }

这是我渲染的方式

public override void Render()
    {
        Context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1f, 0);

        Context.OutputMerger.SetTargets(depthView, RenderTargetView);

        staticMeshRenderer.UpdateCameraConstants();

        foreach(TerrainSegment segment in terrain.SegmentMap) 
        {
            terrainRenderer.Draw(segment, null);
        }

        objectManager.DrawContent(Device);
    }

产生这个输出(不能发布图像,它是一个有工作深度的场景)

然而,当使用像这样的多个rendertargets时

Context.OutputMerger.SetTargets(depthView, RenderTargetView, idView);

Depthstencil停止工作。 用于两次尝试的HLSL代码:

struct PS_Output
{
    float4 Color        : SV_TARGET0;
    uint ID             : SV_TARGET1;
};

PS_Output PShader(VS_OutputStatic input)
{
    PS_Output output;
    output.ID = 3; //test
    output.Color = Diffuse.Sample(StateLinear, input.TexCoords).rgba;
    return output;
}

我在这里做错了什么? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

使用RenderDoc进行调试显示我的缓冲区尺寸不同。修复解决了这个问题。