我想用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;
}
我已經清除後備緩衝每隔一幀用不同的顏色,以確保它不與未正確交換後備緩衝的問題。這工作正常。
我很困惑,爲什麼這不是現在正在工作。我希望任何人都知道這個答案。
您可能指定了錯誤的常量緩衝區大小。檢查這個。但是,我懷疑這是你的問題的原因。在渲染循環中你有多個'present'調用嗎? – 2013-03-08 14:48:12
其實我做過。我改變了它,警告消失了。但是,正如你猜測的那樣,這不是問題的原因。至於禮物() - 通話,不會,只有一個。現在我已經恢復了從我讀過的rastertek教程調整過來的每一行代碼。該教程的代碼工作正常,我的(這是相同的,一行一行)在另一個解決方案是不是..我會嘗試和使用教程作爲基地,現在轉移我自己的代碼,看看到底什麼時候錯誤會彈出。 – 2013-03-09 19:51:03