aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjvech <jmvalenciae@unal.edu.co>2022-11-03 14:50:17 -0500
committerjvech <jmvalenciae@unal.edu.co>2022-11-03 14:50:17 -0500
commit02b8093bf0c09b838650f96d3d86be5d3231490e (patch)
treea4fd3fe3d31fc963c500a7eaf8d2146e043b7db7
parent45584a1c39c699e2bc68638fe2402e590631e3a3 (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.fsh36
-rw-r--r--shaders/dummy.vsh4
-rw-r--r--src/main.c10
-rw-r--r--src/obj.c4
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;
}
diff --git a/src/main.c b/src/main.c
index 636172e..c270a2e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
diff --git a/src/obj.c b/src/obj.c
index 5554b46..d832604 100644
--- a/src/obj.c
+++ b/src/obj.c
@@ -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);
Feel free to download, copy and edit any repo