使用 DrawUserPrimitives 的 C# DirectX 绘制线条工作正常,但 DrawPrimitives

本文关键字:工作 DrawPrimitives DrawUserPrimitives DirectX 绘制 使用 | 更新日期: 2023-09-27 18:36:43

我在C#中使用DirectX时遇到了问题。我想画一些线。首先,我已经用DrawUserPrimitives完成了它,一切都很好。但后来我切换到 vertexBuffer,因为我想进行旋转和其他相机动作。而且我在窗户里什么也看不见。

有一部分代码填充顶点缓冲区并在平面上绘制顶点。

vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 
   8 * (CurrentPanel.ElementsCount() + 1), m_device, Usage.None,
   CustomVertex.PositionColored.Format, Pool.Default);
CustomVertex.PositionColored[] verts =
   (CustomVertex.PositionColored[])vertexBuffer.Lock(0, 0);
//this function returns array of verts based on given points.
verts = CurrentPanel.GetLines(); 
vertexBuffer.Unlock();
m_device.Clear(ClearFlags.Target, System.Drawing.Color.FromArgb(255, 255, 255).ToArgb(), 1.0f, 0);
m_device.BeginScene(); //m_device is my DirectX.Device
SetupViewport(); //Set all of matrixes...
m_device.SetStreamSource(0, vertexBuffer, 0);
m_device.VertexFormat = CustomVertex.PositionColored.Format;
//m_device.DrawUserPrimitives(PrimitiveType.LineList, CurrentPanel.ElementsCount() * 4, verts); // <- WHEN I USE THIS ALL IS OK
m_device.DrawPrimitives(PrimitiveType.LineList, 0, 4*(CurrentPanel.ElementsCount()+1)); //<-DO NOT WORK
m_device.EndScene();
m_device.Present(); 

我想补充一点,此代码基于 Microsoft DirectX 示例。

使用 DrawUserPrimitives 的 C# DirectX 绘制线条工作正常,但 DrawPrimitives

您没有将顶点写入 VertexBuffer。

您创建了一个名为 verts 的变量,并使用它来引用从 Lock 方法返回的 Array,然后将 verts 引用的数组替换为 CurrentPanel.GetLines() 的返回值。但是你实际上并没有向VertexBuffer写入任何东西。