summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
authoromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-03-14 21:54:55 +1100
committeromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-03-14 21:54:55 +1100
commit6c581ff56dfcc22c25538e305e58efd967dd640a (patch)
treeadd8415857a0a7799d06778f3479601007a20e01 /assets
parent7b9ef1066e49fe3e0c7791e097b26445f0f35f3d (diff)
lights, camera, action
Diffstat (limited to 'assets')
-rw-r--r--assets/shaders/blinn_phong.frag76
1 files changed, 75 insertions, 1 deletions
diff --git a/assets/shaders/blinn_phong.frag b/assets/shaders/blinn_phong.frag
index a284948..095b19a 100644
--- a/assets/shaders/blinn_phong.frag
+++ b/assets/shaders/blinn_phong.frag
@@ -9,6 +9,25 @@ struct Material {
float shininess;
};
+struct DirLight {
+ vec3 direction;
+ vec3 ambient;
+ vec3 diffuse;
+ vec3 specular;
+};
+
+struct PointLight {
+ vec3 position;
+ // fall off properties
+ float constant;
+ float linear;
+ float quadratic;
+
+ vec3 ambient;
+ vec3 diffuse;
+ vec3 specular;
+};
+
in VS_OUT {
vec3 FragPos;
vec3 Normal;
@@ -16,6 +35,61 @@ in VS_OUT {
vec4 FragPosLightSpace;
} fs_in;
+// --- Uniforms
+#define NUM_POINT_LIGHTS 4
+uniform vec3 viewPos;
+uniform Material material;
+uniform DirLight dirLight;
+uniform PointLight pointLights[NUM_POINT_LIGHTS];
+
+// --- Function prototypes
+vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir);
+vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir);
+
void main() {
- FragColor = vec4(1.0);
+ vec3 norm = normalize(fs_in.Normal);
+ vec3 viewDir = normalize(viewPos - fs_in.FragPos);
+
+ vec3 result = CalcDirLight(dirLight, norm, viewDir);
+ for (int i = 0; i < 4; i++) {
+ result += CalcPointLight(pointLights[i], norm, fs_in.FragPos, viewDir);
+ }
+
+ FragColor = vec4(result, 1.0);
+}
+
+vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir)
+{
+ vec3 lightDir = normalize(-light.direction);
+ // diffuse shading
+ float diff = max(dot(normal, lightDir), 0.0);
+ // specular shading
+ vec3 reflectDir = reflect(-lightDir, normal);
+ float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
+ // combine result
+ vec3 ambient = light.ambient * vec3(texture(material.diffuse, fs_in.TexCoords));
+ vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, fs_in.TexCoords));
+ vec3 specular = light.specular * spec * vec3(texture(material.specular, fs_in.TexCoords));
+ return (ambient + diffuse + specular);
+}
+
+vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir)
+{
+ vec3 lightDir = normalize(light.position - fragPos);
+ // diffuse
+ float diff = max(dot(normal, lightDir), 0.0);
+ // specular
+ vec3 reflectDir = reflect(-lightDir, normal);
+ float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
+ // attentuation
+ float distance = length(light.position - fragPos);
+ float attentuation = 1.0 / (light.constant + light.linear * distance * light.quadratic * (distance * distance));
+ // result
+ vec3 ambient = light.ambient * vec3(texture(material.diffuse, fs_in.TexCoords));
+ vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, fs_in.TexCoords));
+ vec3 specular = light.specular * spec * vec3(texture(material.specular, fs_in.TexCoords));
+ ambient *= attentuation;
+ diffuse *= attentuation;
+ specular *= attentuation;
+ return (ambient + diffuse + specular);
} \ No newline at end of file