From 7155ea7425ce6b8a1854ccf14076a479ac5541c1 Mon Sep 17 00:00:00 2001 From: MDietermann Date: Thu, 28 May 2026 12:16:09 +0200 Subject: [PATCH] feat: add chunk renderer with interleaved vertex buffer --- Rendering/ChunkRenderer.cs | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Rendering/ChunkRenderer.cs diff --git a/Rendering/ChunkRenderer.cs b/Rendering/ChunkRenderer.cs new file mode 100644 index 0000000..b444d2a --- /dev/null +++ b/Rendering/ChunkRenderer.cs @@ -0,0 +1,52 @@ +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); + } +}