【问题标题】:SharpDX is filling entire form instead of drawing triangleSharpDX 正在填充整个表格而不是绘制三角形
【发布时间】:2019-01-04 17:48:19
【问题描述】:

我正在尝试使用 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);
    }

【问题讨论】:

  • 您是否尝试过顺时针而不是逆时针绘制三角形? (谈论你的顶点的顺序)
  • 另外,您似乎将视口从 0、0 设置为 width, height,但将一些顶点放置在负空间中。这可能会导致只渲染三角形的一部分(如果要正确渲染的话)
  • 是的,我试过了。视口被标准化为 -1, 1(左上角)和 1, -1(右下角),所以 0, -0.5 在窗体上。
  • 你能发布着色器代码吗?
  • 顶点着色器:float4 main(float4 position : POSITION) : SV_POSITION { return position; }

标签: c# sharpdx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多