corrected phong lighting shader

This commit is contained in:
Josh Holtrop 2011-05-06 09:19:24 -04:00
parent 8bd56f42aa
commit fecc8a0e44
3 changed files with 23 additions and 12 deletions

View File

@ -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 vec3 normal_i;
varying vec4 diffuse_i;
void main(void) void main(void)
{ {
@ -9,8 +11,8 @@ void main(void)
vec4 color; vec4 color;
float NdotL, RdotEye; float NdotL, RdotEye;
lightDir = vec3(-0.1, 0, -0.9); lightDir = normalize(vec3(-0.4, 0, -0.9));
color = vec4(0.2, 0.2, 0.2, 1.0); /* ambient light */ color = vec4(0.2, 0.2, 0.2, 1.0) * ambient; /* ambient light */
n = normalize(normal_i); n = normalize(normal_i);
NdotL = max(dot(n, -lightDir), 0.0); NdotL = max(dot(n, -lightDir), 0.0);
@ -18,12 +20,12 @@ void main(void)
if (NdotL > 0.0) if (NdotL > 0.0)
{ {
/* diffuse component */ /* diffuse component */
color += diffuse_i * NdotL; color += diffuse * NdotL;
/* specular component */ /* 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) if (RdotEye > 0.0)
{ {
color += pow(RdotEye, 96.5); color += clamp(specular * pow(RdotEye, shininess), 0.0, 1.0);
} }
} }

View File

@ -27,6 +27,7 @@ const GLushort indices[] = {
0, 1, 2, 3, 4, 5 0, 1, 2, 3, 4, 5
}; };
GLuint program, vs, fs, data_vbo, index_vbo; GLuint program, vs, fs, data_vbo, index_vbo;
GLint ambient_loc, diffuse_loc, specular_loc, shininess_loc;
enum Locations { enum Locations {
LOC_POSITION, LOC_POSITION,
LOC_COLOR, LOC_COLOR,
@ -171,6 +172,17 @@ bool init(int width, int height)
return false; 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)); data_vbo = makeBuffer(GL_ARRAY_BUFFER, data, sizeof(data));
index_vbo = makeBuffer(GL_ELEMENT_ARRAY_BUFFER, indices, sizeof(indices)); index_vbo = makeBuffer(GL_ELEMENT_ARRAY_BUFFER, indices, sizeof(indices));

View File

@ -1,16 +1,13 @@
attribute vec3 pos; attribute vec3 pos;
attribute vec3 color;
attribute vec3 normal; attribute vec3 normal;
varying vec3 eye_pos_i; varying vec3 pos_i;
varying vec3 normal_i; varying vec3 normal_i;
varying vec4 diffuse_i;
void main(void) void main(void)
{ {
gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1); 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; normal_i = gl_NormalMatrix * normal;
diffuse_i = vec4(color, 1);
} }