From d2fbc27fe59c6335a86857016dd403f7a3131925 Mon Sep 17 00:00:00 2001 From: Strangedusk Date: Wed, 3 Aug 2022 14:19:46 +0200 Subject: [PATCH] Attempt color with batch rendering --- src/Renderer.zig | 77 +++++++++++++++++++++-------------------- src/main.zig | 4 +-- src/shaders/fragment.fs | 2 +- src/shaders/vector.vs | 7 +++- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/Renderer.zig b/src/Renderer.zig index 5bb89f3..e912ab4 100644 --- a/src/Renderer.zig +++ b/src/Renderer.zig @@ -65,7 +65,7 @@ pub fn init() !Self { program.link(); - mvp_loc = program.uniformLocation("mvp").?; + mvp_loc = try program.uniformLocation("mvp").?; color_loc = program.uniformLocation("color").?; } program.use(); @@ -81,16 +81,24 @@ pub fn init() !Self { gl.uniformMatrix4fv(mvp_loc, false, &.{ortho.fields}); } + const black = [4]f32{ 0.0, 0.0, 0.0, 1.0 }; + gl.uniform4fv(color_loc, &.{black}); + var vertex_array = gl.VertexArray.gen(); vertex_array.bind(); const buf = gl.Buffer.gen(); buf.bind(.array_buffer); - gl.vertexAttribPointer(0, 2, .float, false, 0, 0); - + gl.vertexAttribPointer(0, 2, .float, false, @sizeOf(f32) * 6, @sizeOf(f32) * 0); gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(1, 4, .float, false, @sizeOf(f32) * 6, @sizeOf(f32) * 4); + gl.enableVertexAttribArray(1); + + // gl.vertexAttribPointer(1, 2, .float, false, 0, 0); + // gl.enableVertexAttribArray(1); + gl.clearColor(0.91, 0.97, 1.00, 1.00); // TODO: See if there's a more optimal solution to this, maybe activating only when necessary @@ -101,20 +109,22 @@ pub fn init() !Self { } pub fn render(self: *Self) void { - std.debug.print("Numer of rendered elements: {}\n", .{self.test_counter}); + std.debug.print("Number of rendered elements: {}\n", .{self.test_counter}); self.test_counter = 0; self.buffer.data(f32, &self.vbo, .static_draw); - { - var i: usize = 0; - while (i < self.vbo_index) { - gl.uniform4fv(self.color_loc, &.{self.colors[i]}); - std.debug.print("Color: {any}\n", .{self.colors[i]}); - gl.drawArrays(.triangles, i, 12); - i += 12; - } - } + // { + // var i: usize = 0; + // while (i < self.vbo_index) { + // gl.uniform4fv(self.color_loc, &.{self.colors[i]}); + // //std.debug.print("Color: {any}\n", .{self.colors[i]}); + // gl.drawArrays(.triangles, i, 12); + // i += 12; + // } + // } + + gl.drawArrays(.triangles, 0, self.vbo_index); self.vbo_index = 0; @@ -164,31 +174,22 @@ fn renderRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void { var hf = @intToFloat(f32, h); const i = self.vbo_index; - self.colors[i + 0] = self.color; - self.colors[i + 1] = self.color; - self.colors[i + 2] = self.color; - self.colors[i + 3] = self.color; - self.colors[i + 4] = self.color; - self.colors[i + 5] = self.color; - self.colors[i + 6] = self.color; - self.colors[i + 7] = self.color; - self.colors[i + 8] = self.color; - self.colors[i + 9] = self.color; - self.colors[i + 10] = self.color; - self.colors[i + 11] = self.color; - self.vbo[i + 0] = xf; - self.vbo[i + 1] = yf; // up-left - self.vbo[i + 2] = xf + wf; - self.vbo[i + 3] = yf; // up-right - self.vbo[i + 4] = xf; - self.vbo[i + 5] = yf + hf; // down-left - self.vbo[i + 6] = xf + wf; - self.vbo[i + 7] = yf + hf; // down-right - self.vbo[i + 8] = xf + wf; - self.vbo[i + 9] = yf; // up-right - self.vbo[i + 10] = xf; - self.vbo[i + 11] = yf + hf; // down-left - self.vbo_index += 12; + const vertex_data = [36]f32{ + xf, yf, // up-left + 0.5, 0.5, 0.5, 0.5, + xf + wf, yf, // up-right + 0.5, 0.5, 0.5, 0.5, + xf, yf + hf, + 0.5, 0.5, 0.5, 0.5, + xf + wf, yf + hf, // down-right + 0.5, 0.5, 0.5, 0.5, + xf + wf, yf, + 0.5, 0.5, 0.5, 0.5, + xf, yf + hf, // down-left + 0.5, 0.5, 0.5, 0.5, + }; + std.mem.copy(f32, self.vbo[i .. i + 36], &vertex_data); + self.vbo_index += 36; } pub const OutputSize = struct { width: c_int, height: c_int }; diff --git a/src/main.zig b/src/main.zig index 542c5a1..84d64fb 100644 --- a/src/main.zig +++ b/src/main.zig @@ -38,8 +38,8 @@ pub fn main() !void { const delay = SDL.getTicks64() - start; std.debug.print("{} ms\n", .{delay}); - if (delay < 16) { - SDL.delay(16 - @intCast(u32, delay)); + if (delay < 17) { + SDL.delay(17 - @intCast(u32, delay)); } } } diff --git a/src/shaders/fragment.fs b/src/shaders/fragment.fs index 2d1d3b0..710359f 100644 --- a/src/shaders/fragment.fs +++ b/src/shaders/fragment.fs @@ -1,6 +1,6 @@ #version 330 core -uniform vec4 color; +in vec4 color; void main(){ gl_FragColor = color; diff --git a/src/shaders/vector.vs b/src/shaders/vector.vs index e863a75..f996a99 100644 --- a/src/shaders/vector.vs +++ b/src/shaders/vector.vs @@ -1,8 +1,13 @@ #version 330 core +layout (location = 0) in vec2 pos; +layout (location = 1) in vec4 v_color; + uniform mat4 mvp; -layout(location = 0) in vec2 pos; + +out color; void main() { + color = v_color; // Taken by fragment.fs gl_Position = mvp * vec4((pos + vec2(0.5, 0.5)), 0, 1); }