2013-03-08 21 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(); 

这对于现在显而易见的原因不能正常工作。有趣的是,它确实似乎适用于其他任何框架。为什么这是我不知道的。但是在将矩阵定义从私有集合更改为现在所有设置都正常工作之后。

相关问题