summaryrefslogtreecommitdiff
path: root/assets/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'assets/shaders')
-rw-r--r--assets/shaders/blinn_phong.frag95
-rw-r--r--assets/shaders/blinn_phong.vert26
2 files changed, 121 insertions, 0 deletions
diff --git a/assets/shaders/blinn_phong.frag b/assets/shaders/blinn_phong.frag
new file mode 100644
index 0000000..095b19a
--- /dev/null
+++ b/assets/shaders/blinn_phong.frag
@@ -0,0 +1,95 @@
+#version 410 core
+out vec4 FragColor;
+
+// A Blinn-Phong material with textures for diffuse and specular
+// lighting maps and a numeric shininess factor.
+struct Material {
+ sampler2D diffuse;
+ sampler2D specular;
+ 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;
+ vec2 TexCoords;
+ 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() {
+ 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
diff --git a/assets/shaders/blinn_phong.vert b/assets/shaders/blinn_phong.vert
new file mode 100644
index 0000000..6028178
--- /dev/null
+++ b/assets/shaders/blinn_phong.vert
@@ -0,0 +1,26 @@
+#version 410 core
+// Inputs
+layout (location = 0) in vec3 inPos;
+layout (location = 1) in vec3 inNormal;
+layout (location = 2) in vec2 inTexCoords;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+uniform mat4 lightSpaceMatrix;
+
+// Output
+out VS_OUT {
+ vec3 FragPos;
+ vec3 Normal;
+ vec2 TexCoords;
+ vec4 FragPosLightSpace;
+} vs_out;
+
+void main() {
+ vs_out.FragPos = vec3(model * vec4(inPos, 1.0));
+ vs_out.Normal = inNormal;
+ vs_out.TexCoords = inTexCoords;
+ vs_out.FragPosLightSpace = lightSpaceMatrix * vec4(vs_out.FragPos, 1.0);
+ gl_Position = projection * view * model * vec4(inPos, 1.0);
+} \ No newline at end of file