2013-03-08 71 views
0

我想用SharpDX(DX11)在屏幕上繪製一個三角形。無論出於何種原因,這個三角形似乎都是每隔一幀畫一次。我的設備初始化代碼如下所示:爲什麼我的網格只顯示每隔一幀?

public void Init() 
    { 
     renderForm = new RenderForm(Engine.GameTitle); 
     renderForm.ClientSize = new Size(Engine.Settings.Screen.Width, Engine.Settings.Screen.Height); 
     renderForm.MaximizeBox = false; 

     var desc = new SwapChainDescription() 
     { 
      BufferCount = 2, 
      ModeDescription = new ModeDescription(renderForm.ClientSize.Width, renderForm.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm), 
      IsWindowed = true, 
      OutputHandle = renderForm.Handle, 
      SampleDescription = new SampleDescription(1, 0), 
      SwapEffect = SwapEffect.Sequential, 
      Usage = Usage.RenderTargetOutput 
     }; 

     Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, desc, out device, out swapChain); 
     deviceContext = device.ImmediateContext; 

     var factory = swapChain.GetParent<Factory>(); 
     factory.MakeWindowAssociation(renderForm.Handle, WindowAssociationFlags.IgnoreAll); 

     backBuffer = Texture2D.FromSwapChain<Texture2D>(swapChain, 0); 
     renderView = new RenderTargetView(device, backBuffer); 

     backBuffer.Dispose(); 

     deviceContext.OutputMerger.SetTargets(renderView); 

     deviceContext.Rasterizer.SetViewports(new Viewport(0, 0, renderForm.ClientSize.Width, renderForm.ClientSize.Height, 0.0f, 1.0f)); 

     ProjectionMatrix = Matrix.PerspectiveFovLH(
      (float)(Math.PI/4), 
      (float)(renderForm.ClientSize.Width/renderForm.ClientSize.Height), 
      nearPlane, 
      farPlane); 

     WorldMatrix = Matrix.Identity; 

     renderForm.Location = new Point(Screen.PrimaryScreen.Bounds.Width/2 - Engine.Settings.Screen.Width/2, Screen.PrimaryScreen.Bounds.Height/2 - Engine.Settings.Screen.Height/2); 
    } 

渲染三角形的代碼如下所示:

public void Render() 
{ 
    DeviceContext context = D3DRenderer.Instance.GetDevice().ImmediateContext; 

    context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, Utilities.SizeOf<Vertex>(), 0)); 
    context.InputAssembler.SetIndexBuffer(IndexBuffer, Format.R32_UInt, 0); 
    context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; 
} 

public void RenderShader(int indexCount) 
{ 
    device.ImmediateContext.DrawIndexed(indexCount, 0, 0); 
} 

而渲染()RenderShader之前被稱爲()。 有除了一個的Direct3D警告通過任何函數返回沒有錯誤消息:

D3D11:警告:ID3D11DeviceContext :: DrawIndexed:在常量緩衝器的在頂點着色器單元的時隙0的尺寸太小(64個字節提供,至少192個字節,預計)。

我MatrixBuffer結構如下所示:

[StructLayout(LayoutKind.Sequential)] 
internal struct MatrixBuffer 
{ 
    public Matrix world; 
    public Matrix view; 
    public Matrix projection; 
} 

我已經清除後備緩衝每隔一幀用不同的顏色,以確保它不與未正確交換後備緩衝的問題。這工作正常。

我很困惑,爲什麼這不是現在正在工作。我希望任何人都知道這個答案。

+0

您可能指定了錯誤的常量緩衝區大小。檢查這個。但是,我懷疑這是你的問題的原因。在渲染循環中你有多個'present'調用嗎? – 2013-03-08 14:48:12

+0

其實我做過。我改變了它,警告消失了。但是,正如你猜測的那樣,這不是問題的原因。至於禮物() - 通話,不會,只有一個。現在我已經恢復了從我讀過的rastertek教程調整過來的每一行代碼。該教程的代碼工作正常,我的(這是相同的,一行一行)在另一個解決方案是不是..我會嘗試和使用教程作爲基地,現在轉移我自己的代碼,看看到底什麼時候錯誤會彈出。 – 2013-03-09 19:51:03

回答

1

女士們,先生們,今天就吸取教訓..永遠不要複製和粘貼教程代碼。永遠。 原來的問題出現在着色器渲染代碼中。本教程我複製從申報(並沒有在這裏發佈,否則它可能已經很明顯,你們)擁有世界/視點/投影矩陣聲明如下:

public Matrix WorldMatrix { get; private set; } 

然後我試圖要做到這一點:

D3DRenderer.Instance.WorldMatrix.Transpose(); 

這對於現在顯而易見的原因不能正常工作。有趣的是,它確實似乎適用於其他任何框架。爲什麼這是我不知道的。但是在將矩陣定義從私有集合更改爲現在所有設置都正常工作之後。

相關問題