Skip to content

Commit ceeee7a

Browse files
committed
Added spotlight
1 parent f3b8f32 commit ceeee7a

3 files changed

Lines changed: 68 additions & 2 deletions

File tree

main.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ int main(int argc, char** argv) {
8383
Shader shader("shaders/basic.vs", "shaders/basic.fs");
8484
shader.bind();
8585
int directionLocation = GLCALL(glGetUniformLocation(shader.getShaderId(), "u_directional_light.direction"));
86-
glm::vec3 sunColor = glm::vec3(0.8f);
86+
glm::vec3 sunColor = glm::vec3(0.0f);
8787
glm::vec3 sunDirection = glm::vec3(-1.0f);
8888
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_directional_light.diffuse"), 1, (float*)&sunColor.data));
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));
9292

93-
glm::vec3 pointLightColor = glm::vec3(0.0f, 0.0f, 1.0f);
93+
glm::vec3 pointLightColor = glm::vec3(0.0f, 0.0f, 0.0f);
9494
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_point_light.diffuse"), 1, (float*)&pointLightColor.data));
9595
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_point_light.specular"), 1, (float*)&pointLightColor.data));
9696
pointLightColor *= 0.2f;
@@ -99,6 +99,18 @@ int main(int argc, char** argv) {
9999
GLCALL(glUniform1f(glGetUniformLocation(shader.getShaderId(), "u_point_light.quadratic"), 0.0028f));
100100
glm::vec4 pointLightPosition = glm::vec4(0.0f, 0.0f, 10.0f, 1.0f);
101101
int positionLocation = GLCALL(glGetUniformLocation(shader.getShaderId(), "u_point_light.position"));
102+
103+
glm::vec3 spotLightColor = glm::vec3(1.0f);
104+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_spot_light.diffuse"), 1, (float*)&spotLightColor.data));
105+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_spot_light.specular"), 1, (float*)&spotLightColor.data));
106+
spotLightColor *= 0.2f;
107+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_spot_light.ambient"), 1, (float*)&spotLightColor.data));
108+
glm::vec3 spotLightPosition = glm::vec3(0.0f);
109+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_spot_light.position"), 1, (float*)&spotLightPosition.data));
110+
spotLightPosition.z = 1.0f;
111+
GLCALL(glUniform3fv(glGetUniformLocation(shader.getShaderId(), "u_spot_light.direction"), 1, (float*)&spotLightPosition.data));
112+
GLCALL(glUniform1f(glGetUniformLocation(shader.getShaderId(), "u_spot_light.innerCone"), 0.95f));
113+
GLCALL(glUniform1f(glGetUniformLocation(shader.getShaderId(), "u_spot_light.outerCone"), 0.80f));
102114

103115
Model monkey;
104116
monkey.init("models/tree.bmf", &shader);

shaders/basic.fs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,23 @@ struct PointLight {
3131
float quadratic;
3232
};
3333

34+
struct SpotLight {
35+
vec3 position;
36+
// Must be a normalized vector
37+
vec3 direction;
38+
39+
float innerCone;
40+
float outerCone;
41+
42+
vec3 diffuse;
43+
vec3 specular;
44+
vec3 ambient;
45+
};
46+
3447
uniform Material u_material;
3548
uniform DirectionalLight u_directional_light;
3649
uniform PointLight u_point_light;
50+
uniform SpotLight u_spot_light;
3751

3852
void main()
3953
{
@@ -55,5 +69,18 @@ void main()
5569
diffuse += attentuation * u_point_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
5670
specular += attentuation * u_point_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
5771

72+
light = normalize(u_spot_light.position - v_position);
73+
reflection = reflect(-light, normal);
74+
float theta = dot(light, u_spot_light.direction);
75+
float epsilon = u_spot_light.innerCone - u_spot_light.outerCone;
76+
float intensity = clamp((theta - u_spot_light.outerCone) / epsilon, 0.0f, 1.0f);
77+
if(theta > u_spot_light.outerCone) {
78+
ambient += u_spot_light.ambient * u_material.diffuse;
79+
diffuse += intensity * u_spot_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
80+
specular += intensity * u_spot_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
81+
} else {
82+
ambient += u_spot_light.ambient * u_material.diffuse;
83+
}
84+
5885
f_color = vec4(ambient + diffuse + specular + u_material.emissive, 1.0f);
5986
}

shaders_old/basic.fs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,23 @@ struct PointLight {
2929
float quadratic;
3030
};
3131

32+
struct SpotLight {
33+
vec3 position;
34+
// Must be a normalized vector
35+
vec3 direction;
36+
37+
float innerCone;
38+
float outerCone;
39+
40+
vec3 diffuse;
41+
vec3 specular;
42+
vec3 ambient;
43+
};
44+
3245
uniform Material u_material;
3346
uniform DirectionalLight u_directional_light;
3447
uniform PointLight u_point_light;
48+
uniform SpotLight u_spot_light;
3549

3650
void main()
3751
{
@@ -53,5 +67,18 @@ void main()
5367
diffuse += attentuation * u_point_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
5468
specular += attentuation * u_point_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
5569

70+
light = normalize(u_spot_light.position - v_position);
71+
reflection = reflect(-light, normal);
72+
float theta = dot(light, u_spot_light.direction);
73+
float epsilon = u_spot_light.innerCone - u_spot_light.outerCone;
74+
float intensity = clamp((theta - u_spot_light.outerCone) / epsilon, 0.0f, 1.0f);
75+
if(theta > u_spot_light.outerCone) {
76+
ambient += u_spot_light.ambient * u_material.diffuse;
77+
diffuse += intensity * u_spot_light.diffuse * max(dot(normal, light), 0.0) * u_material.diffuse;
78+
specular += intensity * u_spot_light.specular * pow(max(dot(reflection, view), 0.000001), u_material.shininess) * u_material.specular;
79+
} else {
80+
ambient += u_spot_light.ambient * u_material.diffuse;
81+
}
82+
5683
gl_FragColor = vec4(ambient + diffuse + specular + u_material.emissive, 1.0f);
5784
}

0 commit comments

Comments
 (0)