EnableClientState
и VertexAttribPointer
не взаимодействуют друг с другом. Если вы хотите использовать возможности на стороне клиента, вы должны использовать VertexPointer
(см. glVertexPointer
):
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);
GL.VertexPointer(3, VertexAttribPointerType.Float, Vector3.SizeInBytes, 0);
GL.EnableClientState(ArrayCap.IndexArray);
не делает то, что вы ожидаете. ArrayCap.IndexArray
предназначено для атрибутов индекса цвета.
Буфер индекса привязан к цели BufferTarget.ElementArrayBuffer
. Он не является атрибутом и не должен быть включен.
Более того, в объекте массива вершин указан буфер индекса. Инструкция GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
нарушит привязку:
private void LoadIndices()
{
int ibo = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo);
GL.BufferData(BufferTarget.ElementArrayBuffer, sizeof(int) * indices.Length, indices, BufferUsageHint.StaticDraw);
// GL.VertexAttribPointer(...) <--- REMOVE
// GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); // <--- REMOVE
RenderLoop.VBOs.Add(ibo);
}
Возможность на стороне клиента указана в Vertex Array Object . Таким образом, это может быть указано в LoadVerts()
:
private void LoadVerts()
{
int vbo = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.BufferData(BufferTarget.ArrayBuffer, Vector3.SizeInBytes * verts.Length, verts, BufferUsageHint.StaticDraw);
// GL.VertexAttribPointer(...); <---- REMOVE
GL.VertexPointer(3, VertexAttribPointerType.Float, Vector3.SizeInBytes, 0); // <--- ADD
GL.EnableClientState(ArrayCap.VertexArray); // <--- ADD
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
RenderLoop.VBOs.Add(vbo);
}
Вся необходимая спецификация указана в объекте Vertex Array, поэтому достаточно связать VAO перед вызовом отрисовки:
public void Render()
{
GL.BindVertexArray(this.GetVAO());
GL.DrawElements(PrimitiveType.Triangles, this.Indices.Length, DrawElementsType.UnsignedInt, 0);
GL.BindVertexArray(0);
}
private void Render(object sender, FrameEventArgs e)
{
GL.Color3(Color.Green);
foreach (Mesh mesh in SceneMeshes)
mesh.Render();
}