Browse Source

update shader logic to use multiple lights

master
cinnaboot 8 years ago
parent
commit
606c88aafb
  1. 18
      data/default.fs
  2. 16
      data/test_scene.json
  3. 4
      src/hexgame.cpp
  4. 7
      src/render_group.cpp
  5. 15
      src/renderer.cpp

18
data/default.fs

@ -15,7 +15,7 @@ struct point_light {
};
#define MAX_LIGHTS 10
uniform point_light lights[MAX_LIGHTS];
uniform int num_lights = 0;
uniform uint num_lights = 0u;
out vec3 color;
@ -23,19 +23,15 @@ void main()
{
// https://www.tomdalling.com/blog/modern-opengl/06-diffuse-point-lighting
vec3 normal = normalize(normal_matrix * fragNormal);
vec3 fragPosition = vec3(model * vec4(fragVertex, 1));
float totalBrightness = 0;
/////
//vec3 surfaceToLight = light_position - fragPosition;
vec3 surfaceToLight = lights[0].position - fragPosition;
/////
for (uint i = 0u; i < num_lights; i++) {
vec3 surfaceToLight = lights[i].position - fragPosition;
float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal));
brightness = clamp(brightness, 0, 1);
totalBrightness += brightness;
}
color = brightness * fragmentColor;
color = clamp(totalBrightness, 0, 1) * fragmentColor;
}

16
data/test_scene.json

@ -84,7 +84,21 @@
},
"position" : {
"x" : 0,
"x" : -400,
"y" : 0,
"z" : 100
}
},
{
"intensity" : 1.0,
"color" : {
"r" : 0,
"g" : 0,
"b" : 0
},
"position" : {
"x" : 200,
"y" : 0,
"z" : 100
}

4
src/hexgame.cpp

@ -525,10 +525,10 @@ int main(int argc, char* argv[])
return 1;
}
// testing scene_loader
// load scene from json
slSceneDoc* sd = slLoadFile(DATA_DIR, DEFAULT_SCENE_FILE, SCENE_SCHEMA_FILE);
if (sd != nullptr) {
game_state* g = g_game_state;
render_state* rs = g_render_state;

7
src/render_group.cpp

@ -331,13 +331,14 @@ drawRenderObject(render_group* rg, render_object* ro,
glBindBuffer(GL_ARRAY_BUFFER, ro->normal_buffer.buffer_id);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
// TODO: testing lighting
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix)));
glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]);
// 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
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix)));
glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]);
glUniform1ui(rg->shader.num_lights_id, num_lights);
for (uint i = 0; i < num_lights; i++) {
// TODO: don't do this every frame * every render_group

15
src/renderer.cpp

@ -67,9 +67,6 @@ static render_group* g_debug_render_group;
static rg_shader_program g_default_shader;
// NOTE: entity render_group pointers are kept in the entity struct
static camera g_camera;
// TODO: testing lighting
//static renPointLight g_test_light;
// TODO: maybe keep all these globals in the render_state object?
@ -264,18 +261,6 @@ createScene(render_state* rs, std::vector<hex_info>* hexes, Entity* entities, ui
rgBufferData(&debug_color_buf, GL_STATIC_DRAW, GL_ARRAY_BUFFER);
rgBufferData(&debug_normal_buf, GL_STATIC_DRAW, GL_ARRAY_BUFFER);
// lights
// TODO: load light properties from scene/level files
// light testing
#if 0
rs->lights[0].light_ID = 0;
rs->lights[0].position = glm::vec3(0.f, 0.f, 200.f);
rs->lights[0].color = glm::vec3(1.f, 1.f, 1.f);
rs->lights[0].intensity = 1.f;
rs->num_lights = 1;
#endif
return true;
}

Loading…
Cancel
Save