C# 无法在Windows 10 Universal App上使用SharpDX绘制基本体(但仍能清除背景)

C# 无法在Windows 10 Universal App上使用SharpDX绘制基本体(但仍能清除背景),c#,directx,directx-11,windows-10-universal,sharpdx,C#,Directx,Directx 11,Windows 10 Universal,Sharpdx,对不起,因为我的英语不好。我试图用SharpDX在Windows 10应用程序上编写一个非常简单的DirectX 11,它在窗口的中间绘制一个三角形。问题是,当我仍然可以更改背景颜色(使用ClearRenderTargetView)时,三角形不会显示。我验证了渲染函数是周期性调用的,我的三角形是正面(顺时针)。我所尝试的: 禁用背面剔除 设置静态宽度和高度 尝试其他基本体(直线、三角形带) 将顶点着色器输入从float3更改为float4,反之亦然 我发现,这有非常相似的症状,但仍然不工作

对不起,因为我的英语不好。我试图用SharpDX在Windows 10应用程序上编写一个非常简单的DirectX 11,它在窗口的中间绘制一个三角形。问题是,当我仍然可以更改背景颜色(使用ClearRenderTargetView)时,三角形不会显示。我验证了渲染函数是周期性调用的,我的三角形是正面(顺时针)。我所尝试的:

  • 禁用背面剔除
  • 设置静态宽度和高度
  • 尝试其他基本体(直线、三角形带)
  • 将顶点着色器输入从float3更改为float4,反之亦然
我发现,这有非常相似的症状,但仍然不工作

我已将我的代码发布在GitHub上,网址为:

以下是我的初始化代码(我认为问题出在这里):

渲染功能:

    D3D11.Buffer triangleVertBuffer;
    D3D11.VertexShader vs;
    D3D11.PixelShader ps;
    D3D11.InputLayout vertLayout;
    RawVector3[] verts;

    private void InitScene()
    {
        D3D11.InputElement[] inputElements = new D3D11.InputElement[]
        {
            new D3D11.InputElement("POSITION", 0, DXGI.Format.R32G32B32_Float, 0)
        };

        using (CompilationResult vsResult = ShaderBytecode.CompileFromFile("vs.hlsl", "main", "vs_4_0"))
        {
            vs = new D3D11.VertexShader(device, vsResult.Bytecode.Data);
            vertLayout = new D3D11.InputLayout(device, vsResult.Bytecode, inputElements);
        }

        using (CompilationResult psResult = ShaderBytecode.CompileFromFile("ps.hlsl", "main", "ps_4_0"))
            ps = new D3D11.PixelShader(device, psResult.Bytecode.Data);

        deviceContext.VertexShader.Set(vs);
        deviceContext.PixelShader.Set(ps);

        verts = new RawVector3[] {
            new RawVector3( 0.0f, 0.5f, 0.5f ),
            new RawVector3( 0.5f, -0.5f, 0.5f ),
            new RawVector3( -0.5f, -0.5f, 0.5f )
        };
        triangleVertBuffer = D3D11.Buffer.Create(device, D3D11.BindFlags.VertexBuffer, verts);

        deviceContext.InputAssembler.InputLayout = vertLayout;
        deviceContext.InputAssembler.PrimitiveTopology = D3D.PrimitiveTopology.TriangleList;
    }
    private void RenderScene()
    {
        this.deviceContext.ClearRenderTargetView(this.backBufferView, new RawColor4(red, green, blue, 0));

        deviceContext.InputAssembler.SetVertexBuffers(0,
            new D3D11.VertexBufferBinding(triangleVertBuffer, Utilities.SizeOf<RawVector3>(), 0));
        deviceContext.Draw(verts.Length, 0);

        this.swapChain.Present(0, DXGI.PresentFlags.None);
    }
private void RenderScene()
{
this.deviceContext.ClearRenderTargetView(this.backBufferView,新的RawColor4(红色、绿色、蓝色,0));
deviceContext.InputAssembler.SetVertexBuffers(0,
新的D3D11.VertexBufferBinding(triangleVertBuffer,Utilities.SizeOf(),0));
deviceContext.Draw(垂直长度,0);
this.swapChain.Present(0,DXGI.PresentFlags.None);
}

谢谢你的帮助。

我已经解决了这个问题。我在Visual Studio中使用了图形调试器,并检测到OutputMerge没有RenderTarget。所以我移动这条线

this.deviceContext.OutputMerger.SetRenderTargets(this.backBufferView);
调用RenderScene()函数,它就可以工作了。然而,我不明白为什么我必须在每一帧重置这个。我是Direct3D新手,所以如果有人有anwswer,请发表评论。多谢各位

p/s:我已经将GitHub上的工作项目提交给了遇到同样问题的人

this.deviceContext.OutputMerger.SetRenderTargets(this.backBufferView);