SharpDX正在填充整个表单而不是绘制三角形

时间:2019-01-04 17:48:19

标签: c# sharpdx

我正在尝试使用C#和SharpDX编写简单的DirectX 11应用程序。我想测试基本绘图,但是当我运行该程序时,我会得到整个表格,并用红色填充。当我更改顶点时,其绘制不需要的形状。清晰的色彩效果。

我尝试更改某些属性,但无济于事。

代码如下:

    private Vector3[] Vertices = new Vector3[]
    {
        new Vector3(-0.5f, 0.5f, 0), new Vector3(0.5f, 0.5f, 0), new Vector3(0, -0.5f, 0)
    };
    private D3D11.Buffer VertexBuffer;

    public Game()
    {
        RenderForm = new RenderForm("Test Form");
        RenderForm.ClientSize = new Size(Width, Height);
        RenderForm.AllowUserResizing = false;

        InitDeviceResources();
        InitShaders();
        InitVertexBuffer();
    }

    public void Run()
    {
        RenderLoop.Run(RenderForm, RenderCallback);
    }

    private void InitVertexBuffer()
    {
        VertexBuffer = D3D11.Buffer.Create<Vector3>(Device, BindFlags.VertexBuffer, Vertices);
    }

    private void InitShaders()
    {
        using (ShaderBytecode vertexShaderBytecode = ShaderBytecode.CompileFromFile("vertexShader.hlsl", "main", "vs_4_0", ShaderFlags.Debug))
        {
            InputSignature = ShaderSignature.GetInputSignature(vertexShaderBytecode);

            VertexShader = new VertexShader(Device, vertexShaderBytecode);
        }

        using (ShaderBytecode pixelShaderBytecode = ShaderBytecode.CompileFromFile("pixelShader.hlsl", "main", "ps_4_0", ShaderFlags.Debug))
        {
            PixelShader = new PixelShader(Device, pixelShaderBytecode);
        }

        Context.VertexShader.Set(VertexShader);
        Context.PixelShader.Set(PixelShader);

        Context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

        InputLayout = new InputLayout(Device, InputSignature, InputElements);
        Context.InputAssembler.InputLayout = InputLayout;
    }

    private void InitDeviceResources()
    {
        ModeDescription backBufferDesc = new ModeDescription(Width, Height, new Rational(60, 1), Format.B8G8R8A8_UNorm);

        SwapChainDescription swapChainDesc = new SwapChainDescription()
        {
            BufferCount = 1,
            IsWindowed = true,
            OutputHandle = RenderForm.Handle,
            ModeDescription = backBufferDesc,
            SampleDescription = new SampleDescription(1, 0),
            Usage = Usage.RenderTargetOutput
        };

        D3D11.Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, swapChainDesc, out Device, out SwapChain);
        Context = Device.ImmediateContext;

        Viewport = new Viewport(0, 0, Width, Height);
        Context.Rasterizer.SetViewport(Viewport);

        using (Texture2D backBuffer = SwapChain.GetBackBuffer<Texture2D>(0))
        {
            RenderTarget = new RenderTargetView(Device, backBuffer);
        }
    }

    private void RenderCallback()
    {
        Draw();
    }

    private void Draw()
    {
        Context.OutputMerger.SetRenderTargets(RenderTarget);

        Context.ClearRenderTargetView(RenderTarget, new Color4(0, 0, 1, 1));

        Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, Utilities.SizeOf<Vector3>(), 0));

        Context.Draw(Vertices.Count(), 0);

        SwapChain.Present(1, PresentFlags.None);
    }

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。必须有Format.R32G32B32_Float而不是Format.R32G32B32A32_Float