multiple lights
This commit is contained in:
parent
1ec82871ad
commit
abffb2fe7c
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue