2016-07-28 32 views
0

Sorry wegen meiner schlechten Englisch. Ich versuche, eine sehr einfache DirectX 11 auf Windows 10 App mit SharpDX zu schreiben, die ein Dreieck in der Mitte der Fenster zeichnet. Das Problem ist das Dreieck wird nicht angezeigt, während ich noch die Hintergrundfarbe ändern kann (mit ClearRenderTargetView). Ich habe überprüft, dass die Renderfunktion periodisch aufgerufen wird und mein Dreieck ist die Vorderseite (im Uhrzeigersinn). Was ich versucht:Kann nicht zeichnen mit SharpDX unter Windows 10 Universal App (aber immer noch in der Lage, den Hintergrund zu löschen)

  • Disable back-Face Culling
  • Stellen statische Höhe und Breite
  • Versuchen andere Primitive (Linie, Dreieckstreifen)
  • Ändern Vertexshader Eingang von float3 float4 und umge versa

Ich fand, dass diese post sehr ähnliche Symptome hat, aber immer noch nicht funktioniert!

Ich habe meinen Code auf GitHub im Internet abrufbar: https://github.com/minhcly/UWP3DTest

Hier ist mein Code für die Initialisierung (wo ich denke, das Problem liegt):

D3D11.Device2 device; 
    D3D11.DeviceContext deviceContext; 
    DXGI.SwapChain2 swapChain; 
    D3D11.Texture2D backBufferTexture; 
    D3D11.RenderTargetView backBufferView; 

    private void InitializeD3D() 
    { 
     using (D3D11.Device defaultDevice = new D3D11.Device(D3D.DriverType.Hardware, D3D11.DeviceCreationFlags.Debug)) 
      this.device = defaultDevice.QueryInterface<D3D11.Device2>(); 
     this.deviceContext = this.device.ImmediateContext2; 

     DXGI.SwapChainDescription1 swapChainDescription = new DXGI.SwapChainDescription1() 
     { 
      AlphaMode = DXGI.AlphaMode.Ignore, 
      BufferCount = 2, 
      Format = DXGI.Format.R8G8B8A8_UNorm, 
      Height = (int)(this.swapChainPanel.RenderSize.Height), 
      Width = (int)(this.swapChainPanel.RenderSize.Width), 
      SampleDescription = new DXGI.SampleDescription(1, 0), 
      Scaling = SharpDX.DXGI.Scaling.Stretch, 
      Stereo = false, 
      SwapEffect = DXGI.SwapEffect.FlipSequential, 
      Usage = DXGI.Usage.RenderTargetOutput 
     }; 

     using (DXGI.Device3 dxgiDevice3 = this.device.QueryInterface<DXGI.Device3>()) 
     using (DXGI.Factory3 dxgiFactory3 = dxgiDevice3.Adapter.GetParent<DXGI.Factory3>()) 
     { 
      DXGI.SwapChain1 swapChain1 = new DXGI.SwapChain1(dxgiFactory3, this.device, ref swapChainDescription); 
      this.swapChain = swapChain1.QueryInterface<DXGI.SwapChain2>(); 
     } 

     using (DXGI.ISwapChainPanelNative nativeObject = ComObject.As<DXGI.ISwapChainPanelNative>(this.swapChainPanel)) 
      nativeObject.SwapChain = this.swapChain; 

     this.backBufferTexture = this.swapChain.GetBackBuffer<D3D11.Texture2D>(0); 
     this.backBufferView = new D3D11.RenderTargetView(this.device, this.backBufferTexture); 
     this.deviceContext.OutputMerger.SetRenderTargets(this.backBufferView); 

     deviceContext.Rasterizer.State = new D3D11.RasterizerState(device, new D3D11.RasterizerStateDescription() 
     { 
      CullMode = D3D11.CullMode.None, 
      FillMode = D3D11.FillMode.Solid, 
      IsMultisampleEnabled = true 
     }); 
     deviceContext.Rasterizer.SetViewport(0, 0, (int)swapChainPanel.Width, (int)swapChainPanel.Height); 

     CompositionTarget.Rendering += CompositionTarget_Rendering; 
     Application.Current.Suspending += Current_Suspending; 

     isDXInitialized = true; 
    } 

InitScene() Funktion:

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; 
    } 

Render-Funktion:

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); 
    } 

Vielen Dank für Ihre Hilfe.

Antwort

0

Ich habe das Problem gelöst. Ich habe den Grafik-Debugger in Visual Studio verwendet und festgestellt, dass der OutputMerger kein RenderTarget hat. Also verschiebe ich die Zeile

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

an die RenderScene() -Funktion und es funktioniert. Allerdings kann ich nicht nachvollziehen, warum ich das bei jedem Frame zurücksetzen muss. Ich bin neu in Direct3D, also wenn jemand ein Anwswer hat, bitte Kommentar. Vielen Dank.

P/s: Ich habe das Arbeitsprojekt auf dem GitHub für jeden, der das gleiche Problem mit mir hat, begangen.