diff options
author | jvech <jmvalenciae@unal.edu.co> | 2022-11-03 14:50:17 -0500 |
---|---|---|
committer | jvech <jmvalenciae@unal.edu.co> | 2022-11-03 14:50:17 -0500 |
commit | 02b8093bf0c09b838650f96d3d86be5d3231490e (patch) | |
tree | a4fd3fe3d31fc963c500a7eaf8d2146e043b7db7 | |
parent | 45584a1c39c699e2bc68638fe2402e590631e3a3 (diff) |
add: material and illumnation render implemented
shaders now render the models using ambient, diffuse and specular
properties and react to directional light.
-rw-r--r-- | shaders/dummy.fsh | 36 | ||||
-rw-r--r-- | shaders/dummy.vsh | 4 | ||||
-rw-r--r-- | src/main.c | 10 | ||||
-rw-r--r-- | src/obj.c | 4 |
4 files changed, 46 insertions, 8 deletions
diff --git a/shaders/dummy.fsh b/shaders/dummy.fsh index 472bb26..75c7ef2 100644 --- a/shaders/dummy.fsh +++ b/shaders/dummy.fsh @@ -1,17 +1,47 @@ #version 330 core - struct Material { vec3 ambient; vec3 diffuse; vec3 specular; + int illum; float Ns; }; -uniform Material mtl; +struct DirLight { + vec3 direction; + + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + out vec4 FragColor; +in vec3 FragPos; +in vec3 Normal; +in vec2 TexCoords; + +uniform vec3 viewPos; +uniform DirLight dirLight; +uniform Material mtl; + + + void main() { - FragColor = vec4(mtl.diffuse, 1.0); + vec3 norm = normalize(Normal); + vec3 viewDir = normalize(viewPos - FragPos); + + vec3 lightDir = normalize(-dirLight.direction); + float diff = max(dot(norm, lightDir), 0.0); + + vec3 reflectDir = normalize(reflect(-lightDir, norm)); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), mtl.Ns); + + vec3 ambient = dirLight.ambient * mtl.ambient; + vec3 diffuse = diff * dirLight.diffuse * mtl.diffuse; + vec3 specular = spec * dirLight.specular * mtl.specular; + + FragColor = vec4(ambient + diffuse + specular, 1.0); } diff --git a/shaders/dummy.vsh b/shaders/dummy.vsh index bd540ab..d3a2082 100644 --- a/shaders/dummy.vsh +++ b/shaders/dummy.vsh @@ -15,6 +15,6 @@ void main() { gl_Position = proj * view * model * vec4(aPos, 1.0f); FragPos = vec3(model * vec4(aPos, 1.0)); - //Normal = vec3(rotNormals * vec4(aNormal, 1.0)); - //TexCoords = aTexCoords; + Normal = vec3(rotNormals * vec4(aNormal, 1.0)); + TexCoords = aTexCoords; } @@ -299,7 +299,7 @@ int main(int argc, char *argv[]) struct Camera mainCamera; mainCamera.position = linearVec3(0.0, 0.0, 10.0); - mainCamera.front = linearVec3(0.0, 0.0, -1.0); + mainCamera.front = linearVec3(0.0, 0.0, 1.0); mainCamera.up = linearVec3(0.0, 1.0, 0.0); Mat4 model, view, proj; @@ -312,7 +312,7 @@ int main(int argc, char *argv[]) glEnable(GL_DEPTH_TEST); while (!glfwWindowShouldClose(window)) { processInput(window); - glClearColor(0.7f, 0.7f, 0.7f, 1.0f); + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glfwGetWindowSize(window, &width, &height); sprintf(title, "mverse: x: %f y: %f z: %f", @@ -340,6 +340,12 @@ int main(int argc, char *argv[]) shaderSetMatrixfv(shader, "proj", proj.matrix[0], glUniformMatrix4fv); shaderSetMatrixfv(shader, "view", view.matrix[0], glUniformMatrix4fv); shaderSetMatrixfv(shader, "rotNormals", R.matrix[0], glUniformMatrix4fv); + shaderSetfv(shader, "viewPos", mainCamera.position.vector, glUniform3fv); + + shaderSetfv(shader, "dirLight.direction", vec3(-0.2, -1.0, 0.3), glUniform3fv); + shaderSetfv(shader, "dirLight.ambient", vec3(0.1, 0.1, 0.1), glUniform3fv); + shaderSetfv(shader, "dirLight.diffuse", vec3(0.8, 0.8, 0.8), glUniform3fv); + shaderSetfv(shader, "dirLight.specular", vec3(1.0, 1.0, 1.0), glUniform3fv); objDraw(shader, obj); @@ -398,8 +398,10 @@ appendMtl(char *line, Material **mtl, int index) if (index == 0) *mtl = (Material *)calloc(1, sizeof(Material)); - else + else { *mtl = (Material *)realloc(*mtl, (index + 1) * sizeof(Material)); + memset(*mtl + index, 0, sizeof(Material)); + } sscanf(line, "%s", name); strncpy((*mtl + index)->name, name, OBJ_LINE_MAX); |