multiple lights

This commit is contained in:
Luca Conte 2024-06-24 14:39:20 +02:00
parent 1ec82871ad
commit abffb2fe7c
3 changed files with 18 additions and 9 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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);