diff --git a/u07-light/fragmentShader.glsl b/u07-light/fragmentShader.glsl index 98de4ed..1a16084 100644 --- a/u07-light/fragmentShader.glsl +++ b/u07-light/fragmentShader.glsl @@ -1,22 +1,43 @@ #version 330 core + in vec3 normal; in vec3 fragmentPosition; -vec4 ambientLight = vec4(0.1, 0.1, 0.1, 1.0); -vec4 surfaceColor = vec4(0.7, 0.7, 0.9, 1.0); +uniform vec4 ambientColor; +uniform vec4 diffusionColor; +uniform vec4 specularColor; -vec3 lightPosition = vec3(3.0, 3.0, 3.0); -vec4 lightColor = vec4(1.0, 1.0, 1.0, 1.0); +uniform float shininess; + +uniform vec4 ambientLight; +uniform vec3 lightPosition; +uniform vec4 lightColor; -float emissionStrength = 0.1; +float emissionStrength = 0.0; void main() { vec3 norm = normalize(normal); vec3 lightDir = normalize(lightPosition - fragmentPosition); + vec3 eyeDir = -normalize(fragmentPosition); + float diff = max(dot(norm, lightDir), 0.0); - gl_FragColor = surfaceColor * emissionStrength + ambientLight * surfaceColor + diff * lightColor * surfaceColor; + vec3 halfway = (lightDir + eyeDir) / length(lightDir + eyeDir); + float specular = pow(max(dot(halfway, norm), 0.0), shininess); + + gl_FragColor = + // EMISSION + diffusionColor * emissionStrength + + + // // AMBIENT + ambientLight * ambientColor + + + // DIFFUSION + diff * lightColor * diffusionColor + + + // SPECULAR + specular * lightColor * specularColor; } \ No newline at end of file diff --git a/u07-light/main.c b/u07-light/main.c index 8bc96db..a6631b6 100644 --- a/u07-light/main.c +++ b/u07-light/main.c @@ -241,7 +241,7 @@ void draw(void) { // -------------- PROJECTION TRANSFORMATION ---------------- mat4 projectionTransformation; GLfloat near = 0.1f; - GLfloat far = 10.0f; + GLfloat far = 20.0f; perspectiveProjection(&projectionTransformation, near, far); @@ -252,11 +252,36 @@ void draw(void) { normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far); + mat4 modelView; + identity(&modelView); + multiply(&modelView, &modelTransformation, &modelView); + multiply(&modelView, &viewingTransformation, &modelView); + + mat4 projection; + identity(&projection); + multiply(&projection, &projectionTransformation, &projection); + multiply(&projection, &normalisationTransformation, &projection); + + // send transformation matrix to shader - glUniformMatrix4fv(glGetUniformLocation(program, "modelTransformation"), 1, GL_FALSE, (GLfloat*)&modelTransformation); - glUniformMatrix4fv(glGetUniformLocation(program, "viewingTransformation"), 1, GL_FALSE, (GLfloat*)&viewingTransformation); - glUniformMatrix4fv(glGetUniformLocation(program, "projectionTransformation"), 1, GL_FALSE, (GLfloat*)&projectionTransformation); - glUniformMatrix4fv(glGetUniformLocation(program, "normalisationTransformation"), 1, GL_FALSE, (GLfloat*)&normalisationTransformation); + glUniformMatrix4fv(glGetUniformLocation(program, "modelView"), 1, GL_FALSE, (GLfloat*)&modelView); + glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection); + + + vec4 lightPosition = {cos(stepi * 2) * 3.0f, 3.0f, sin(stepi * 2) * 3.0f, 1.0f}; + multiplyAny((GLfloat *)&lightPosition, (GLfloat *)&modelView, (GLfloat *)&lightPosition, 4, 4, 1); + + glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z); + + // SET MATERIAL DATA + glUniform4f(glGetUniformLocation(program, "ambientColor"), 0.25f, 0.22f, 0.06f, 1.0f); + glUniform4f(glGetUniformLocation(program, "diffusionColor"), 0.35f, 0.31f, 0.09f, 1.0f); + glUniform4f(glGetUniformLocation(program, "specularColor"), 0.80f, 0.72f, 0.21f, 1.0f); + glUniform1f(glGetUniformLocation(program, "shininess"), 83.2f * 4.0f); + + // SET LIGHT DATA + glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f); + glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.2f, 0.2f, 0.2f, 1.0f); // draw!!1 glDrawArrays(GL_TRIANGLES, 0, numFaces * 3); diff --git a/u07-light/matrixMath.h b/u07-light/matrixMath.h index 9edc7dd..16530a0 100644 --- a/u07-light/matrixMath.h +++ b/u07-light/matrixMath.h @@ -9,6 +9,13 @@ typedef struct { GLfloat z; } vec3; +typedef struct { + GLfloat x; + GLfloat y; + GLfloat z; + GLfloat w; +} vec4; + typedef struct { GLfloat m00; GLfloat m10; diff --git a/u07-light/vertexShader.glsl b/u07-light/vertexShader.glsl index e781808..e76273e 100644 --- a/u07-light/vertexShader.glsl +++ b/u07-light/vertexShader.glsl @@ -2,18 +2,16 @@ layout (location = 0) in vec3 aPosition; layout (location = 1) in vec3 aNormal; -uniform mat4 modelTransformation; -uniform mat4 viewingTransformation; -uniform mat4 projectionTransformation; -uniform mat4 normalisationTransformation; +uniform mat4 modelView; +uniform mat4 projection; // uniform mat4 modelTransformation; out vec3 normal; out vec3 fragmentPosition; void main() { - normal = vec3(modelTransformation * vec4(aNormal, 1.0)); + normal = mat3(transpose(inverse(modelView))) * aNormal; - gl_Position = normalisationTransformation * projectionTransformation * viewingTransformation * modelTransformation * vec4(aPosition, 1.0); - fragmentPosition = vec3(modelTransformation * vec4(aPosition, 1.0)); + gl_Position = projection * modelView * vec4(aPosition, 1.0); + fragmentPosition = vec3(modelView * vec4(aPosition, 1.0)); } \ No newline at end of file