using OpenTK.Graphics.OpenGL4; namespace VoxelEngine.Rendering; public sealed class ChunkRenderer : IDisposable { private const int FloatsPerVertex = 6; // pos.xyz, uv, shade private readonly int _vao; private readonly int _vbo; private readonly int _vertexCount; public ChunkRenderer(float[] vertices) { _vertexCount = vertices.Length / FloatsPerVertex; int stride = FloatsPerVertex * sizeof(float); _vao = GL.GenVertexArray(); GL.BindVertexArray(_vao); _vbo = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, _vbo); GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw); // location 0: position (vec3) at offset 0 GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, stride, 0); GL.EnableVertexAttribArray(0); // location 1: uv (vec2) at offset 3 floats GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, stride, 3 * sizeof(float)); GL.EnableVertexAttribArray(1); // location 2: shade (float) at offset 5 floats GL.VertexAttribPointer(2, 1, VertexAttribPointerType.Float, false, stride, 5 * sizeof(float)); GL.EnableVertexAttribArray(2); GL.BindVertexArray(0); } public void Draw() { GL.BindVertexArray(_vao); GL.DrawArrays(PrimitiveType.Triangles, 0, _vertexCount); GL.BindVertexArray(0); } public void Dispose() { GL.DeleteBuffer(_vbo); GL.DeleteVertexArray(_vao); } }