corrected phong lighting shader
This commit is contained in:
parent
8bd56f42aa
commit
fecc8a0e44
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user