我想用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