From abffb2fe7c1a1e8d7fe40e465f44731160cd1457 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Mon, 24 Jun 2024 14:39:20 +0200 Subject: [PATCH] multiple lights --- src/Makefile | 2 +- src/fragmentShader.glsl | 17 +++++++++++------ src/main.c | 8 ++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/Makefile b/src/Makefile index bebb830..cd091c7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,7 +15,7 @@ test.out: test.o $(OBJ) gcc -o $@ test.o $(OBJ) $(ALL_LIBS) %Shader.c: %Shader.glsl - xxd -i $? > $@ + xxd -i $? | tac | sed "3s/$$/, 0x00/" | tac > $@ main.o: $(SHADERS) matrixMath.h transformation.h wavefrontobj.h sceneGraph.h objectHandler.h shader.h diff --git a/src/fragmentShader.glsl b/src/fragmentShader.glsl index bf7c06a..04acf12 100644 --- a/src/fragmentShader.glsl +++ b/src/fragmentShader.glsl @@ -10,7 +10,9 @@ flat in mat3 TBN; uniform float shininess; uniform vec4 ambientLight; -uniform vec3 lightPosition; +uniform vec3 lightPositions[2]; +uniform float lightBrightness[2]; + uniform vec4 lightColor; uniform sampler2D textureSampler; @@ -27,12 +29,15 @@ void main() { vec3 lightDir = normalize(lightPosition - fragmentPosition); vec3 eyeDir = (-normalize(fragmentPosition)); + for (int i = 0; i < lightPositions.length(); i++) { + vec3 lightDir = normalize(lightPositions[i] - fragmentPosition); - float diff = max(dot(norm, lightDir), 0.0); - vec3 halfway = (lightDir + eyeDir) / length(lightDir + eyeDir); - float specular = pow(max(dot(halfway, norm), 0.0), shininess); + sumDiffusion += max(dot(norm, lightDir), 0.0) * lightBrightness[i]; + vec3 halfway = (lightDir + eyeDir) / length(lightDir + eyeDir); + sumSpecular += pow(max(dot(halfway, norm), 0.0), shininess); + } gl_FragColor = // EMISSION @@ -42,8 +47,8 @@ void main() { ambientLight * color + // DIFFUSION - color * diff + + color * sumDiffusion + // SPECULAR - specular * lightColor * color; + sumSpecular * lightColor * color; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7246cdb..417d861 100644 --- a/src/main.c +++ b/src/main.c @@ -296,13 +296,17 @@ void draw(void) { glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection); // SET LIGHT DATA - glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f); + glUniform4f(glGetUniformLocation(program, "lightColor"), 0.2f, 0.2f, 0.2f, 0.5f); glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); vec4 lightPosition = {cos(stepi) * 5.0f, 5.0f, sin(stepi) * 5.0f, 1.0f}; multiplyAny((GLfloat*)&lightPosition, (GLfloat*)&viewingTransformation, (GLfloat*)&lightPosition, 4, 4, 1); - glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z); + glUniform3f(glGetUniformLocation(program, "lightPositions[0]"), lightPosition.x, lightPosition.y, lightPosition.z); + glUniform3f(glGetUniformLocation(program, "lightPositions[1]"), -lightPosition.x, lightPosition.y, -lightPosition.z); + + glUniform1f(glGetUniformLocation(program, "lightBrightness[0]"), 0.5f); + glUniform1f(glGetUniformLocation(program, "lightBrightness[1]"), 0.5f); renderSceneNode(rootNode);