From 688fee362d5812cf37cd4a19d03e01ea365c3445 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Sat, 21 Nov 2020 12:22:26 -0500 Subject: [PATCH] can't use individual uniform buffer objects for each light we want to allow for thousands of lights eventually for deferred lighting, and most cards have a limit of less than 15 GL_MAX_FRAGMENT_UNIFORM_BLOCKS --- include/lights.h | 3 ++- src/default_shaders.cpp | 7 +++---- src/lights.cpp | 12 ++++-------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/include/lights.h b/include/lights.h index deba1ac..cb36ba5 100644 --- a/include/lights.h +++ b/include/lights.h @@ -22,7 +22,8 @@ struct light_group bool needs_update; }; -light_group* lightsInit(uint max_lights = 10); +// NOTE: max_lights should match the max_lights variable in the fragment shader +light_group* lightsInit(uint max_lights = 1000); void lightsOut(light_group* lights); diff --git a/src/default_shaders.cpp b/src/default_shaders.cpp index 70d72f6..cdd38d4 100644 --- a/src/default_shaders.cpp +++ b/src/default_shaders.cpp @@ -33,6 +33,8 @@ out vec4 color; uniform mat4 model; uniform mat3 normal_matrix; +uniform sampler2D sampler; +uniform uint num_lights = 0u; struct point_light { uint light_ID; @@ -40,11 +42,8 @@ struct point_light { vec3 color; float intensity; }; -#define MAX_LIGHTS 10 -uniform point_light lights[MAX_LIGHTS]; -uniform uint num_lights = 0u; -uniform sampler2D sampler; +uniform point_light lights[1000]; void main() diff --git a/src/lights.cpp b/src/lights.cpp index dad58fd..c6bc9a3 100644 --- a/src/lights.cpp +++ b/src/lights.cpp @@ -1,4 +1,6 @@ +#include // stringstream + #include "lights.h" @@ -34,22 +36,16 @@ lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity) return true; } -#include - void lightsUpdate(light_group* lights, shader_program* shader) { - // set shader max_lights uniform to match.. - // TODO: use Uniform Buffer Objects to update light data - // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_uniform_buffer_object.txt - // https://www.khronos.org/opengl/wiki/Uniform_Buffer_Objects - glUniform1ui(shader->num_lights_id, lights->num_lights); for (uint i = 0; i < lights->num_lights; i++) { std::stringstream ss; ss << "lights[" << i << "].position"; - int light_pos_loc = glGetUniformLocation(shader->program_id, ss.str().c_str()); + int light_pos_loc = + glGetUniformLocation(shader->program_id, ss.str().c_str()); glUniform3fv(light_pos_loc, 1, &lights->lights[i].position[0]); }