diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-12-04 14:55:24 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-12-04 14:55:24 -0500 |
| commit | b56c621bf7c8689ba4b5d9fd64a6d69387f705df (patch) | |
| tree | abaa9aa9e41a04f06a42913472f01a31829a756c | |
| parent | initial chunk rendering (diff) | |
| download | voxel-b56c621bf7c8689ba4b5d9fd64a6d69387f705df.tar.gz voxel-b56c621bf7c8689ba4b5d9fd64a6d69387f705df.tar.bz2 voxel-b56c621bf7c8689ba4b5d9fd64a6d69387f705df.zip | |
add ubos
| -rwxr-xr-x | assets/fragment.glsl | 2 | ||||
| -rwxr-xr-x | assets/vertex.glsl | 6 | ||||
| -rw-r--r-- | src/main.c | 3 | ||||
| -rw-r--r-- | src/mesh.c | 40 | ||||
| -rw-r--r-- | src/mesh.h | 16 | ||||
| -rw-r--r-- | src/shader.c | 18 | ||||
| -rw-r--r-- | src/shader.h | 11 |
7 files changed, 67 insertions, 29 deletions
diff --git a/assets/fragment.glsl b/assets/fragment.glsl index 831a8ab..4065771 100755 --- a/assets/fragment.glsl +++ b/assets/fragment.glsl @@ -1,4 +1,4 @@ -#version 330
+#version 330 core
flat in uint pass_data;
diff --git a/assets/vertex.glsl b/assets/vertex.glsl index a0af427..d14d852 100755 --- a/assets/vertex.glsl +++ b/assets/vertex.glsl @@ -1,12 +1,12 @@ -#version 330
+#version 330 core
in vec3 position;
in uint data;
-flat out uint pass_data;
-
uniform mat4 proj_view;
+flat out uint pass_data;
+
void main(void)
{
gl_Position = proj_view * vec4(position, 1.0);
@@ -3,6 +3,7 @@ #include "voxel.h" #include "window.h" #include "shader.h" +#include "mesh.h" int main(void) { @@ -35,7 +36,7 @@ int main(void) camera_proj_view(&camera, proj_view); shader_bind(shader); - shader_loadm4f(0, proj_view); + shader_load_mat4(0, proj_view); mesh_bind(&mesh); mesh_draw(&mesh); mesh_unbind(&mesh); @@ -10,13 +10,13 @@ void mesh_init(Mesh *mesh, int vertex_count) glBindVertexArray(mesh->vao); } -static void mesh_store(Mesh *mesh, void *data, int data_len, int dimensions, GLenum type) +static void mesh_store(Mesh *mesh, void *data, int len, int dimensions, GLenum type) { GLuint vbo; GLint index = mesh->vbos_count; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, data_len, data, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, len, data, GL_STATIC_DRAW); glEnableVertexAttribArray(index); if (type == GL_FLOAT) glVertexAttribPointer(index, dimensions, type, GL_FALSE, 0, 0); @@ -25,26 +25,24 @@ static void mesh_store(Mesh *mesh, void *data, int data_len, int dimensions, GLe mesh->vbos[mesh->vbos_count++] = vbo; } -void mesh_storef(Mesh *mesh, float *data, int data_len, int dimensions) +void mesh_storef(Mesh *mesh, float *data, int count, int dimensions) { - mesh_store(mesh, data, data_len * sizeof(float), dimensions, GL_FLOAT); + mesh_store(mesh, data, count * sizeof(float), dimensions, GL_FLOAT); } -void mesh_storei(Mesh *mesh, int *data, int data_len, int dimensions) +void mesh_storei(Mesh *mesh, int *data, int count, int dimensions) { - mesh_store(mesh, data, data_len * sizeof(int), dimensions, GL_INT); + mesh_store(mesh, data, count * sizeof(int), dimensions, GL_INT); } -void mesh_storeu(Mesh *mesh, unsigned int *data, int data_len, int dimensions) +void mesh_storeu(Mesh *mesh, unsigned int *data, int count, int dimensions) { - mesh_store(mesh, data, data_len * sizeof(unsigned int), dimensions, - GL_UNSIGNED_INT); + mesh_store(mesh, data, count * sizeof(unsigned int), dimensions, GL_UNSIGNED_INT); } -void mesh_storeb(Mesh *mesh, unsigned char *data, int data_len, int dimensions) +void mesh_storeb(Mesh *mesh, unsigned char *data, int count, int dimensions) { - mesh_store(mesh, data, data_len * sizeof(unsigned char), dimensions, - GL_UNSIGNED_BYTE); + mesh_store(mesh, data, count * sizeof(unsigned char), dimensions, GL_UNSIGNED_BYTE); } void mesh_finish(void) @@ -71,8 +69,26 @@ void mesh_draw(Mesh *mesh) glDrawArrays(GL_TRIANGLES, 0, mesh->vertex_count); } +void mesh_draw_instanced(Mesh *mesh, int count) +{ + glDrawArraysInstanced(GL_TRIANGLES, 0, mesh->vertex_count, count); +} + void mesh_free(Mesh *mesh) { glDeleteBuffers(mesh->vbos_count, mesh->vbos); glDeleteVertexArrays(1, &mesh->vao); } + +void uniform_init(Uniform *uniform, void *data, int len) +{ + glGenBuffers(1, &uniform->id); + glBindBuffer(GL_UNIFORM_BUFFER, uniform->id); + glBufferData(GL_UNIFORM_BUFFER, len, data, GL_STATIC_DRAW); + glBindBuffer(GL_UNIFORM_BUFFER, 0); +} + +void uniform_free(Uniform *uniform) +{ + glDeleteBuffers(1, &uniform->id); +} @@ -12,12 +12,20 @@ typedef struct { } Mesh; void mesh_init(Mesh *mesh, int vertex_count); -void mesh_storef(Mesh *mesh, float *data, int data_len, int dimensions); -void mesh_storei(Mesh *mesh, int *data, int data_len, int dimensions); -void mesh_storeu(Mesh *mesh, unsigned int *data, int data_len, int dimensions); -void mesh_storeb(Mesh *mesh, unsigned char *data, int data_len, int dimensions); +void mesh_storef(Mesh *mesh, float *data, int count, int dimensions); +void mesh_storei(Mesh *mesh, int *data, int count, int dimensions); +void mesh_storeu(Mesh *mesh, unsigned int *data, int count, int dimensions); +void mesh_storeb(Mesh *mesh, unsigned char *data, int count, int dimensions); void mesh_finish(void); void mesh_bind(Mesh *mesh); void mesh_unbind(Mesh *mesh); void mesh_draw(Mesh *mesh); +void mesh_draw_instanced(Mesh *mesh, int count); void mesh_free(Mesh *mesh); + +typedef struct { + GLuint id; +} Uniform; + +void uniform_init(Uniform *uniform, void *data, int len); +void uniform_free(Uniform *uniform); diff --git a/src/shader.c b/src/shader.c index eefcfc2..26bb92b 100644 --- a/src/shader.c +++ b/src/shader.c @@ -6,6 +6,8 @@ #include "voxel.h" #include "shader.h" +static GLint current_program; + static char *read_file(const char *filename) { FILE *file; @@ -136,6 +138,7 @@ failure: void shader_bind(Shader *shader) { + current_program = shader->program_id; glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -146,6 +149,7 @@ void shader_bind(Shader *shader) void shader_unbind(void) { + current_program = 0; glDisable(GL_CULL_FACE); glUseProgram(0); } @@ -165,22 +169,28 @@ GLint shader_uniform_location(Shader *shader, const char *name) return glGetUniformLocation(shader->program_id, name); } -void shader_loadf(GLint location, float value) +void shader_load_float(GLint location, float value) { glUniform1f(location, value); } -void shader_loadi(GLint location, int value) +void shader_load_int(GLint location, int value) { glUniform1i(location, value); } -void shader_loadv3f(GLint location, vec3 value) +void shader_load_vec3(GLint location, vec3 value) { glUniform3f(location, value[0], value[1], value[2]); } -void shader_loadm4f(GLint location, mat4 value) +void shader_load_mat4(GLint location, mat4 value) { glUniformMatrix4fv(location, 1, GL_FALSE, (float *)value); } + +void shader_load_ubo(GLint location, GLuint index, Uniform *uniform) +{ + glUniformBlockBinding(current_program, index, location); + glBindBufferBase(GL_UNIFORM_BUFFER, location, uniform->id); +} diff --git a/src/shader.h b/src/shader.h index 931dd33..e6f794e 100644 --- a/src/shader.h +++ b/src/shader.h @@ -3,6 +3,8 @@ #include <GL/gl.h> #include <cglm/cglm.h> +#include "mesh.h" + typedef struct { GLuint program_id; GLuint vertex_id; @@ -16,7 +18,8 @@ void shader_unbind(void); void shader_free(Shader *shader); GLint shader_uniform_location(Shader *shader, const char *name); -void shader_loadf(GLint location, float value); -void shader_loadi(GLint location, int value); -void shader_loadv3f(GLint location, vec3 value); -void shader_loadm4f(GLint location, mat4 value); +void shader_load_float(GLint location, float value); +void shader_load_int(GLint location, int value); +void shader_load_vec3(GLint location, vec3 value); +void shader_load_mat4(GLint location, mat4 value); +void shader_load_ubo(GLint location, GLuint index, Uniform *uniform); |