Skip to content

Commit 05902af

Browse files
authored
Merge pull request #29 from Pilzschaf/tutorial33-pointlight
Pointlight
2 parents afe9f1d + 02ae19e commit 05902af

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

main.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ int main(int argc, char** argv) {
8989
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.specular"), 1, (float*)&sunColor.data));
9090
sunColor *= 0.4f;
9191
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.ambient"), 1, (float*)&sunColor.data));
92+
93+
glm::vec3 pointLightColor = glm::vec3(0.0f, 0.0f, 1.0f);
94+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_point_light.diffuse"), 1, (float*)&pointLightColor.data));
95+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_point_light.specular"), 1, (float*)&pointLightColor.data));
96+
pointLightColor *= 0.2f;
97+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_point_light.ambient"), 1, (float*)&pointLightColor.data));
98+
GLCALL(glUniform1f(glGetUniformLocation(shader.getShaderId(), "u_point_light.linear"), 0.027f));
99+
GLCALL(glUniform1f(glGetUniformLocation(shader.getShaderId(), "u_point_light.quadratic"), 0.0028f));
100+
glm::vec4 pointLightPosition = glm::vec4(0.0f, 0.0f, 10.0f, 1.0f);
101+
int positionLocation = GLCALL(glGetUniformLocation(shader.getShaderId(), "u_point_light.position"));
92102

93103
Model monkey;
94104
monkey.init("models/tree.bmf", &shader);
@@ -215,6 +225,11 @@ int main(int argc, char** argv) {
215225
glm::vec4 transformedSunDirection = glm::transpose(glm::inverse(camera.getView())) * glm::vec4(sunDirection, 1.0f);
216226
glUniform3fv(directionLocation, 1, (float*)&transformedSunDirection.data);
217227

228+
glm::mat4 pointLightMatrix = glm::rotate(glm::mat4(1.0f), -delta, {0.0f, 1.0f, 0.0f});
229+
pointLightPosition = pointLightMatrix * pointLightPosition;
230+
glm::vec3 transformedPointLightPosition = (glm::vec3) (camera.getView() * pointLightPosition);
231+
glUniform3fv(positionLocation, 1, (float*)&transformedPointLightPosition.data);
232+
218233
GLCALL(glUniformMatrix4fv(modelViewProjMatrixLocation, 1, GL_FALSE, &modelViewProj[0][0]));
219234
GLCALL(glUniformMatrix4fv(modelViewLocation, 1, GL_FALSE, &modelView[0][0]));
220235
GLCALL(glUniformMatrix4fv(invModelViewLocation, 1, GL_FALSE, &invModelView[0][0]));

shaders/basic.fs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,20 @@ struct DirectionalLight {
2020
vec3 ambient;
2121
};
2222

23+
struct PointLight {
24+
vec3 position;
25+
26+
vec3 diffuse;
27+
vec3 specular;
28+
vec3 ambient;
29+
30+
float linear;
31+
float quadratic;
32+
};
33+
2334
uniform Material u_material;
2435
uniform DirectionalLight u_directional_light;
36+
uniform PointLight u_point_light;
2537

2638
void main()
2739
{
@@ -35,5 +47,13 @@ void main()
3547
vec3 diffuse = u_directional_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
3648
vec3 specular = u_directional_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
3749

50+
light = normalize(u_point_light.position - v_position);
51+
reflection = reflect(-light, normal);
52+
float distance = length(u_point_light.position - v_position);
53+
float attentuation = 1.0 / ((1.0) + (u_point_light.linear*distance) + (u_point_light.quadratic*distance*distance));
54+
ambient += attentuation * u_point_light.ambient * u_material.diffuse;
55+
diffuse += attentuation * u_point_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
56+
specular += attentuation * u_point_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
57+
3858
f_color = vec4(ambient + diffuse + specular + u_material.emissive, 1.0f);
3959
}

0 commit comments

Comments
 (0)