C# 使用动态绘图的OpenGL绘图元素
遇到动态绘制问题,无法理解其无法渲染的原因。这是绑定代码C# 使用动态绘图的OpenGL绘图元素,c#,opengl,opentk,C#,Opengl,Opentk,遇到动态绘制问题,无法理解其无法渲染的原因。这是绑定代码 public void GenerateAttributesPolygonDynamic(ref int VBO, ref int VAO, ref int EBO, int ArrayLength, int IndiciesLength) { VBO = GL.GenBuffer(); VAO = GL.GenVertexArray(); EBO = GL.GenBuffer();
public void GenerateAttributesPolygonDynamic(ref int VBO, ref int VAO, ref int EBO, int ArrayLength, int IndiciesLength)
{
VBO = GL.GenBuffer();
VAO = GL.GenVertexArray();
EBO = GL.GenBuffer();
GL.BindVertexArray(VAO);
GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
GL.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * ArrayLength, IntPtr.Zero, BufferUsageHint.DynamicDraw);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
GL.BufferData(BufferTarget.ElementArrayBuffer, sizeof(uint) * IndiciesLength, IntPtr.Zero, BufferUsageHint.DynamicDraw);
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(1, 4, VertexAttribPointerType.Float, false, 6 * sizeof(float), 2 * sizeof(float));
GL.EnableVertexAttribArray(1);
}
VBO由2个浮点XY坐标和4个RGBA浮点组成。在这个绑定之后,我调用了draw函数,在画布上看不到任何东西
public void Draw()
{
float[] Verticies = new float[]
{
-0.5f, 0.5f, Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
0.5f, 0.5f, Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
0.5f, -0.5f, Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
-0.5f, -0.5f, Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A
};
uint[] Indicies = new uint[]
{
0, 1, 3,
1, 2, 3
};
GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, sizeof(float) * Verticies.Length, Verticies);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
GL.BufferSubData(BufferTarget.ElementArrayBuffer, IntPtr.Zero, sizeof(uint) * Indicies.Length, Indicies);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
GL.BindVertexArray(VAO);
GL.UseProgram(ProgramID);
GL.DrawElements(PrimitiveType.Triangles, Indicies.Length, DrawElementsType.UnsignedInt, 0);
GL.BindVertexArray(0);
}
希望有人能帮助我。着色器简单而正确,在绑定静态绘制类型时工作良好。在动态渲染对象时,我需要使用Dynamic_Draw方法和BufferSubData来解决其他问题,这段代码就是我一直坚持的示例。非常感谢您的帮助存储在中。调用GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)时代码>(VAO已绑定),绑定已断开
除去
GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)代码>
当缓冲区绑定到目标BufferTarget.ElementArrayBuffer
时,该缓冲区将与当前绑定的顶点数组对象相关联。其行为与缓冲目标.ArrayBuffer
不同
初始化索引时,绑定VAO就足够了,因为在GenerateAttributesPolygonDynamic
中,索引缓冲区已分配给VAO:
GL.BindVertexArray(VAO);
总账BufferSubData(BufferTarget.ElementArrayBuffer,IntPtr.Zero,
尺寸(单位)*标记、长度、标记);
存储在中。调用GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)时代码>(VAO已绑定),绑定已断开
除去
GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)代码>
当缓冲区绑定到目标BufferTarget.ElementArrayBuffer
时,该缓冲区将与当前绑定的顶点数组对象相关联。其行为与缓冲目标.ArrayBuffer
不同
初始化索引时,绑定VAO就足够了,因为在GenerateAttributesPolygonDynamic
中,索引缓冲区已分配给VAO:
GL.BindVertexArray(VAO);
总账BufferSubData(BufferTarget.ElementArrayBuffer,IntPtr.Zero,
尺寸(单位)*标记、长度、标记);
找到了解决方案。调用方法GenerateAttributesPolygonDynamic
时,我设置了不正确的ArrayLength参数,没有颜色字节。非常感谢你们所有人。主题需要关闭。找到了解决方案。调用方法GenerateAttributesPolygonDynamic
时,我设置了不正确的ArrayLength参数,没有颜色字节。非常感谢你们所有人。主题需要关闭。useage提示只是一个提示,无论您指定哪个提示,实际输出都应该完全相同(不过性能可能会有所不同)。因此,如果您只需将提示更改回STATIC\u DRAW
,您的代码就能正常工作,那么您可能有一些奇怪的驱动程序错误,或者您的代码中可能有一些错误,很可能是一些未定义的行为。谢谢您的回答!我认为bug是可能的,但是这个方法只运行一次(在做一些严肃的事情之前编写过),并且调用了Render,但没有元素buffer,它可以正确地渲染(在鼠标光标周围画一条简单的线,效果很好)。我真的很困惑到底是什么问题。这里没有任何GL错误检查代码的迹象。运行时可能会告诉您问题出在哪里,但您没有听。尝试将GL.GetError()放入Draw方法中,但在VBO绑定后获得InvalidValue。在EBO绑定后也进行了检查,未发现错误。困惑如何解决问题:/useage提示只是一个提示,无论您指定哪个提示,实际输出都应该完全相同(尽管性能可能不同)。因此,如果您只需将提示更改回STATIC\u DRAW
,您的代码就能正常工作,那么您可能有一些奇怪的驱动程序错误,或者您的代码中可能有一些错误,很可能是一些未定义的行为。谢谢您的回答!我认为bug是可能的,但是这个方法只运行一次(在做一些严肃的事情之前编写过),并且调用了Render,但没有元素buffer,它可以正确地渲染(在鼠标光标周围画一条简单的线,效果很好)。我真的很困惑到底是什么问题。这里没有任何GL错误检查代码的迹象。运行时可能会告诉您问题出在哪里,但您没有听。尝试将GL.GetError()放入Draw方法中,但在VBO绑定后获得InvalidValue。在EBO绑定后也进行了检查,未发现错误。困惑如何解决问题:/谢谢您的帮助,但仍然从GL.drawerelements进行渲染没有帮助。但是当我完全移除ElementsBuffer时,DynamicDraw工作得很好,但它不是一个解决方案,它需要制作更多的垂直并为每个元素放置RGBAthem@AlexanderMan我懂了。无论如何,这是应用程序中的一个bug。可能还有一些。谢谢你的帮助,但是仍然从GL.DrainElements进行渲染没有帮助。但是当我完全移除ElementsBuffer时,DynamicDraw工作得很好,但它不是一个解决方案,它需要制作更多的垂直并为每个元素放置RGBAthem@AlexanderMan我懂了。无论如何,这是应用程序中的一个bug。可能还有一些。