Skip to content

Commit afe9f1d

Browse files
authored
Merge pull request #28 from Pilzschaf/tutorial32-directionallight
Directional light
2 parents 931811b + d3476ac commit afe9f1d

4 files changed

Lines changed: 62 additions & 25 deletions

File tree

main.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ int main(int argc, char** argv) {
8282

8383
Shader shader("shaders/basic.vs", "shaders/basic.fs");
8484
shader.bind();
85+
int directionLocation = GLCALL(glGetUniformLocation(shader.getShaderId(), "u_directional_light.direction"));
86+
glm::vec3 sunColor = glm::vec3(0.8f);
87+
glm::vec3 sunDirection = glm::vec3(-1.0f);
88+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.diffuse"), 1, (float*)&sunColor.data));
89+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.specular"), 1, (float*)&sunColor.data));
90+
sunColor *= 0.4f;
91+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.ambient"), 1, (float*)&sunColor.data));
8592

8693
Model monkey;
8794
monkey.init("models/tree.bmf", &shader);
@@ -204,6 +211,9 @@ int main(int argc, char** argv) {
204211
modelViewProj = camera.getViewProj() * model;
205212
glm::mat4 modelView = camera.getView() * model;
206213
glm::mat4 invModelView = glm::transpose(glm::inverse(modelView));
214+
215+
glm::vec4 transformedSunDirection = glm::transpose(glm::inverse(camera.getView())) * glm::vec4(sunDirection, 1.0f);
216+
glUniform3fv(directionLocation, 1, (float*)&transformedSunDirection.data);
207217

208218
GLCALL(glUniformMatrix4fv(modelViewProjMatrixLocation, 1, GL_FALSE, &modelViewProj[0][0]));
209219
GLCALL(glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, &modelView[0][0]));

mesh.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class Mesh {
2424
vertexBuffer = new VertexBuffer(vertices.data(), numVertices);
2525
indexBuffer = new IndexBuffer(indices.data(), numIndices, sizeof(indices[0]));
2626

27-
diffuseLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_diffuse"));
28-
specularLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_specular"));
29-
emissiveLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_emissive"));
30-
shininessLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_shininess"));
27+
diffuseLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_material.diffuse"));
28+
specularLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_material.specular"));
29+
emissiveLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_material.emissive"));
30+
shininessLocation = GLCALL(glGetUniformLocation(shader->getShaderId(), "u_material.shininess"));
3131
}
3232
~Mesh() {
3333
delete vertexBuffer;

shaders/basic.fs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,35 @@ layout(location = 0) out vec4 f_color;
55
in vec3 v_normal;
66
in vec3 v_position;
77

8-
uniform vec3 u_diffuse;
9-
uniform vec3 u_specular;
10-
uniform vec3 u_emissive;
11-
uniform float u_shininess;
8+
struct Material {
9+
vec3 diffuse;
10+
vec3 specular;
11+
vec3 emissive;
12+
float shininess;
13+
};
14+
15+
struct DirectionalLight {
16+
vec3 direction;
17+
18+
vec3 diffuse;
19+
vec3 specular;
20+
vec3 ambient;
21+
};
22+
23+
uniform Material u_material;
24+
uniform DirectionalLight u_directional_light;
1225

1326
void main()
1427
{
1528
// Vector from fragment to camera (camera always at 0,0,0)
1629
vec3 view = normalize(-v_position);
17-
vec3 light = normalize(vec3(1.0f, 1.0f, 1.0f));
1830
vec3 normal = normalize(v_normal);
19-
vec3 reflection = reflect(-light, normal);
2031

21-
vec3 ambient = u_diffuse * 0.2;
22-
vec3 diffuse = max(dot(normal, light), 0.0) * u_diffuse;
23-
vec3 specular = pow(max(dot(reflection, view), 0.000001), u_shininess) * u_specular;
32+
vec3 light = normalize(-u_directional_light.direction);
33+
vec3 reflection = reflect(u_directional_light.direction, normal);
34+
vec3 ambient = u_directional_light.ambient * u_material.diffuse;
35+
vec3 diffuse = u_directional_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
36+
vec3 specular = u_directional_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
2437

25-
f_color = vec4(ambient + diffuse + specular + u_emissive, 1.0f);
38+
f_color = vec4(ambient + diffuse + specular + u_material.emissive, 1.0f);
2639
}

shaders_old/basic.fs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,35 @@
33
varying vec3 v_normal;
44
varying vec3 v_position;
55

6-
uniform vec3 u_diffuse;
7-
uniform vec3 u_specular;
8-
uniform vec3 u_emissive;
9-
uniform float u_shininess;
6+
struct Material {
7+
vec3 diffuse;
8+
vec3 specular;
9+
vec3 emissive;
10+
float shininess;
11+
};
12+
13+
struct DirectionalLight {
14+
vec3 direction;
15+
16+
vec3 diffuse;
17+
vec3 specular;
18+
vec3 ambient;
19+
};
20+
21+
uniform Material u_material;
22+
uniform DirectionalLight u_directional_light;
1023

1124
void main()
1225
{
1326
vec3 view = normalize(-v_position);
14-
vec3 light = normalize(vec3(1.0f, 1.0f, 1.0f));
1527
vec3 normal = normalize(v_normal);
16-
vec3 reflection = reflect(-light, normal);
17-
18-
vec3 ambient = u_diffuse * 0.2;
19-
vec3 diffuse = max(dot(normal, light), 0.0) * u_diffuse;
20-
vec3 specular = pow(max(dot(reflection, view), 0.000001), u_shininess) * u_specular;
28+
29+
30+
vec3 light = normalize(-u_directional_light.direction);
31+
vec3 reflection = reflect(u_directional_light.direction, normal);
32+
vec3 ambient = u_directional_light.ambient * u_material.diffuse;
33+
vec3 diffuse = u_directional_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
34+
vec3 specular = u_directional_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
2135

22-
gl_FragColor = vec4(ambient + diffuse + specular + u_emissive, 1.0f);
36+
gl_FragColor = vec4(ambient + diffuse + specular + u_material.emissive, 1.0f);
2337
}

0 commit comments

Comments
 (0)