OpenGL 对 glDrawArrays() 的无效操作
OpenGL invalid operation on glDrawArrays()
我是 运行 一个带有 Pencil.Gaming 库的 C# 项目,它是 GLFW 的 C# 绑定,它使用 OpenTK 来包装 OpenGL 函数。我正在尝试在 vbo 中绘制一个顶点数组,一旦我到达 GL.DrawArrays
,当我调用 GL.GetError()
时,它会给我一个 System.AccessViolationException
和一个 Invalid Operation
错误。下面是我的 Mesh class 代码,错误的屏幕截图是 Visual Studio。我正在尝试绘制的对象和我的 Vertex class 的副本也在下面。
static Mesh mesh;
mesh = new Mesh();
Vertex[] data = new Vertex[] {new Vertex(new Vector3(-1,-1,0)),
new Vertex(new Vector3(0,1,0)),
new Vertex(new Vector3(1,-1,0))};
mesh.addVertices(data);
mesh.draw();
顶点Class:
struct Vertex
{
public static readonly int SIZE = 3;
private Vector3 position;
public Vertex(Vector3 position)
{
this.position = position;
}
}
网格 class:
using System;
using Pencil.Gaming.Graphics;
using Pencil.Gaming.MathUtils;
namespace Practicalis.Rendering
{
class Mesh
{
private int size;
private int vbo;
public Mesh()
{
size = 0;
GL.GenBuffers(size, out vbo);
}
public void addVertices(Vertex[] vertices)
{
size = vertices.Length * sizeof(float);
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, (IntPtr)vbo, BufferUsageHint.StaticDraw);
}
public void draw()
{
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vertex.SIZE * 4, 0);
Console.WriteLine(GL.GetError());
GL.DrawArrays(BeginMode.Triangles, 0, size);
GL.DisableVertexAttribArray(0);
}
}
}
GL.GenBuffers(size, out vbo);
在此行之前,您的大小为 0。它应该至少为 1,因为这是要生成的缓冲区的数量。
在添加顶点函数中,我没有传入我的实际顶点数组,只是指向 vbo 的指针。正确的功能如下。
public void addVertices(Vertex[] vertices)
{
size = vertices.Length * Vector3.SizeInBytes;
Vector3[] vertsData = new Vector3[vertices.Length];
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
for (int i = 0; i < vertices.Length; i++)
vertsData[i] = vertices[i].Position;
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, vertsData, BufferUsageHint.StaticDraw);
}
我是 运行 一个带有 Pencil.Gaming 库的 C# 项目,它是 GLFW 的 C# 绑定,它使用 OpenTK 来包装 OpenGL 函数。我正在尝试在 vbo 中绘制一个顶点数组,一旦我到达 GL.DrawArrays
,当我调用 GL.GetError()
时,它会给我一个 System.AccessViolationException
和一个 Invalid Operation
错误。下面是我的 Mesh class 代码,错误的屏幕截图是 Visual Studio。我正在尝试绘制的对象和我的 Vertex class 的副本也在下面。
static Mesh mesh;
mesh = new Mesh();
Vertex[] data = new Vertex[] {new Vertex(new Vector3(-1,-1,0)),
new Vertex(new Vector3(0,1,0)),
new Vertex(new Vector3(1,-1,0))};
mesh.addVertices(data);
mesh.draw();
顶点Class:
struct Vertex
{
public static readonly int SIZE = 3;
private Vector3 position;
public Vertex(Vector3 position)
{
this.position = position;
}
}
网格 class:
using System;
using Pencil.Gaming.Graphics;
using Pencil.Gaming.MathUtils;
namespace Practicalis.Rendering
{
class Mesh
{
private int size;
private int vbo;
public Mesh()
{
size = 0;
GL.GenBuffers(size, out vbo);
}
public void addVertices(Vertex[] vertices)
{
size = vertices.Length * sizeof(float);
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, (IntPtr)vbo, BufferUsageHint.StaticDraw);
}
public void draw()
{
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vertex.SIZE * 4, 0);
Console.WriteLine(GL.GetError());
GL.DrawArrays(BeginMode.Triangles, 0, size);
GL.DisableVertexAttribArray(0);
}
}
}
GL.GenBuffers(size, out vbo);
在此行之前,您的大小为 0。它应该至少为 1,因为这是要生成的缓冲区的数量。
在添加顶点函数中,我没有传入我的实际顶点数组,只是指向 vbo 的指针。正确的功能如下。
public void addVertices(Vertex[] vertices)
{
size = vertices.Length * Vector3.SizeInBytes;
Vector3[] vertsData = new Vector3[vertices.Length];
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
for (int i = 0; i < vertices.Length; i++)
vertsData[i] = vertices[i].Position;
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, vertsData, BufferUsageHint.StaticDraw);
}