From fecc8a0e4423c54a08abc0a3183cda55c181f3d4 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 6 May 2011 09:19:24 -0400 Subject: [PATCH] corrected phong lighting shader --- lighting/f_shader.glsl | 16 +++++++++------- lighting/test.cc | 12 ++++++++++++ lighting/v_shader.glsl | 7 ++----- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lighting/f_shader.glsl b/lighting/f_shader.glsl index e1fdafb..abca9aa 100644 --- a/lighting/f_shader.glsl +++ b/lighting/f_shader.glsl @@ -1,7 +1,9 @@ -varying vec3 eye_pos_i; +uniform vec4 ambient, diffuse, specular; +uniform float shininess; + +varying vec3 pos_i; varying vec3 normal_i; -varying vec4 diffuse_i; void main(void) { @@ -9,8 +11,8 @@ void main(void) vec4 color; float NdotL, RdotEye; - lightDir = vec3(-0.1, 0, -0.9); - color = vec4(0.2, 0.2, 0.2, 1.0); /* ambient light */ + lightDir = normalize(vec3(-0.4, 0, -0.9)); + color = vec4(0.2, 0.2, 0.2, 1.0) * ambient; /* ambient light */ n = normalize(normal_i); NdotL = max(dot(n, -lightDir), 0.0); @@ -18,12 +20,12 @@ void main(void) if (NdotL > 0.0) { /* diffuse component */ - color += diffuse_i * NdotL; + color += diffuse * NdotL; /* specular component */ - RdotEye = dot(normalize(eye_pos_i), normalize(reflect(-lightDir, n))); + RdotEye = dot(normalize(-pos_i), normalize(reflect(-lightDir, n))); if (RdotEye > 0.0) { - color += pow(RdotEye, 96.5); + color += clamp(specular * pow(RdotEye, shininess), 0.0, 1.0); } } diff --git a/lighting/test.cc b/lighting/test.cc index 1c98886..ae0aee0 100644 --- a/lighting/test.cc +++ b/lighting/test.cc @@ -27,6 +27,7 @@ const GLushort indices[] = { 0, 1, 2, 3, 4, 5 }; GLuint program, vs, fs, data_vbo, index_vbo; +GLint ambient_loc, diffuse_loc, specular_loc, shininess_loc; enum Locations { LOC_POSITION, LOC_COLOR, @@ -171,6 +172,17 @@ bool init(int width, int height) return false; } + ambient_loc = glGetUniformLocation(program, "ambient"); + diffuse_loc = glGetUniformLocation(program, "diffuse"); + specular_loc = glGetUniformLocation(program, "specular"); + shininess_loc = glGetUniformLocation(program, "shininess"); + + glUseProgram(program); + glUniform4f(ambient_loc, 0.2, 0.2, 0.2, 1.0); + glUniform4f(diffuse_loc, 1.0, 0.6, 0.0, 1.0); + glUniform4f(specular_loc, 1.0, 1.0, 1.0, 1.0); + glUniform1f(shininess_loc, 85.0); + data_vbo = makeBuffer(GL_ARRAY_BUFFER, data, sizeof(data)); index_vbo = makeBuffer(GL_ELEMENT_ARRAY_BUFFER, indices, sizeof(indices)); diff --git a/lighting/v_shader.glsl b/lighting/v_shader.glsl index 4881a17..6fde1ce 100644 --- a/lighting/v_shader.glsl +++ b/lighting/v_shader.glsl @@ -1,16 +1,13 @@ attribute vec3 pos; -attribute vec3 color; attribute vec3 normal; -varying vec3 eye_pos_i; +varying vec3 pos_i; varying vec3 normal_i; -varying vec4 diffuse_i; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1); - eye_pos_i = vec3(gl_Position.x, gl_Position.y, gl_Position.z); + pos_i = vec3(gl_Position.x, gl_Position.y, gl_Position.z); normal_i = gl_NormalMatrix * normal; - diffuse_i = vec4(color, 1); }