SharpDX不绘图 [英] SharpDX Not Drawing

查看:89
本文介绍了SharpDX不绘图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用SharpDX用C#编写一个简单的DirectX 11应用程序。我能够设置清晰的颜色,并且可行,但是当我尝试绘制多边形时,它们不会显示。我正在另一个源文件中创建一个新的 Game 类,以创建窗口并绘制到窗口。

I am trying my hand at writing a simple DirectX 11 application in C# using SharpDX. I am able to set the clear color, and that works, but when I try to draw polygons, they do not show up. I am creating a new Game class in another source file to create the window and draw to it.

Game。 cs:

Game.cs:

using System;
using System.Linq;
using System.Drawing;

using SharpDX.Windows;
using SharpDX.DXGI;
using SharpDX.Direct3D;
using SharpDX.D3DCompiler;
using SharpDX;

using DXMath = SharpDX.Mathematics.Interop;
using D3D11 = SharpDX.Direct3D11;

namespace testthing
{
    class Game : IDisposable
    {
        private RenderForm renderForm;
        private int width = 1280;
        private int height = 720;

        private D3D11.Device device;
        private D3D11.DeviceContext context;
        private SwapChain swapChain;

        private D3D11.RenderTargetView renderTarget;

        private DXMath.RawVector3[] verts;
        private D3D11.Buffer vertexBuffer;

        private D3D11.VertexShader vertShader;
        private D3D11.PixelShader pixelShader;

        private D3D11.InputElement[] inputElements = new D3D11.InputElement[]
        {
            new D3D11.InputElement("POSITION", 0, Format.R32G32B32_Float, 0)
        };
        private ShaderSignature inputSignature;
        private D3D11.InputLayout inputLayout;

        private DXMath.RawViewportF viewport;

        private double time = 0;
        public Game()
        {
            renderForm = new RenderForm("DxDemo");
            renderForm.ClientSize = new Size(width, height);
            renderForm.AllowUserResizing = false;

            InitDevice();

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

            CompileShaders();

            RenderLoop.Run(renderForm, Render);
        }
        private void InitDevice()
        {
            ModeDescription backBufferDesc = new ModeDescription(width, height, new Rational(60,1), Format.R8G8B8A8_UNorm);
            SwapChainDescription swapChainDesc = new SwapChainDescription()
            {
                ModeDescription = backBufferDesc,
                SampleDescription = new SampleDescription(1,0),
                Usage = Usage.RenderTargetOutput,
                BufferCount = 1,
                OutputHandle = renderForm.Handle,
                IsWindowed = true
            };

            D3D11.Device.CreateWithSwapChain(DriverType.Hardware, D3D11.DeviceCreationFlags.None, swapChainDesc, out device, out swapChain);
            context = device.ImmediateContext;

            using (D3D11.Texture2D backBuffer = swapChain.GetBackBuffer<D3D11.Texture2D>(0))
            {
                renderTarget = new D3D11.RenderTargetView(device, backBuffer);
            }
            context.OutputMerger.SetRenderTargets(renderTarget);

            viewport = new DXMath.RawViewportF()
            {
                X = 0,
                Y = 0,
                Width = width,
                Height = height
            };
            context.Rasterizer.SetViewport(viewport);
        }
        private void CompileShaders()
        {
            using (var vsBC = ShaderBytecode.CompileFromFile("vertex.hlsl", "main", "vs_4_0", ShaderFlags.Debug))
            {
                inputSignature = ShaderSignature.GetInputSignature(vsBC);
                vertShader = new D3D11.VertexShader(device, vsBC);
            }
            using (var psBC = ShaderBytecode.CompileFromFile("pixel.hlsl", "main", "ps_4_0", ShaderFlags.Debug))
            {
                pixelShader = new D3D11.PixelShader(device, psBC);
            }
            context.VertexShader.Set(vertShader);
            context.PixelShader.Set(pixelShader);

            inputLayout = new D3D11.InputLayout(device, inputSignature, inputElements);
            context.InputAssembler.InputLayout = inputLayout;
        }
        private void Render()
        {
            time = time + 0.01;
            context.ClearRenderTargetView(renderTarget, new DXMath.RawColor4(0.5f, 0.5f, 0.5f, 0.0f));

            context.InputAssembler.SetVertexBuffers(0, new D3D11.VertexBufferBinding(vertexBuffer, Utilities.SizeOf<DXMath.RawVector3>(), 0));
            context.Draw(verts.Count(), 0);

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


        public void Dispose()
        {
            inputLayout.Dispose();
            inputSignature.Dispose();

            vertexBuffer.Dispose();

            vertShader.Dispose();
            pixelShader.Dispose();

            renderTarget.Dispose();
            swapChain.Dispose();

            device.Dispose();
            context.Dispose();

            renderForm.Dispose();
        }
    }
}

vertex.hlsl:

vertex.hlsl:

float4 main(float4 position : POSITION) : SV_POSITION
{
    return position;
}

pixel.hlsl:

pixel.hlsl:

float4 main(float4 position : SV_POSITION) : SV_TARGET
{
    return float4(1.0,0.0,0.0,1.0);
}

编辑:原来渲染目标视图是即使我正在调用 context.OutputMerger.SetRenderTargets(renderTarget)

Turns out the render target view is not being bound, even though I am calling context.OutputMerger.SetRenderTargets(renderTarget).

推荐答案

已解决!

我只是不知道视口的最大深度不能超过1.0,因此我不得不将栅格状态设置为禁用背面剔除。

I just did not know that viewports can't have a max depth more than 1.0 and I had to set the raster state to disable backface culling.

这篇关于SharpDX不绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆