summaryrefslogtreecommitdiff
path: root/assets/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'assets/shaders')
-rw-r--r--assets/shaders/blinn_phong.frag97
-rw-r--r--assets/shaders/blinn_phong.vert28
-rw-r--r--assets/shaders/object.frag15
-rw-r--r--assets/shaders/object.vert29
-rw-r--r--assets/shaders/skinned.vert59
5 files changed, 228 insertions, 0 deletions
diff --git a/assets/shaders/blinn_phong.frag b/assets/shaders/blinn_phong.frag
new file mode 100644
index 0000000..a0ba905
--- /dev/null
+++ b/assets/shaders/blinn_phong.frag
@@ -0,0 +1,97 @@
+#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;
+ vec4 Color;
+} 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);
+ FragColor = fs_in.Color + 0.5;
+}
+
+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..06dc5e7
--- /dev/null
+++ b/assets/shaders/blinn_phong.vert
@@ -0,0 +1,28 @@
+#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;
+ vec4 Color;
+} 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);
+ vs_out.Color = vec4(1.0);
+ gl_Position = projection * view * model * vec4(inPos, 1.0);
+} \ No newline at end of file
diff --git a/assets/shaders/object.frag b/assets/shaders/object.frag
new file mode 100644
index 0000000..fa50fcf
--- /dev/null
+++ b/assets/shaders/object.frag
@@ -0,0 +1,15 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(location = 0) in vec3 in_position;
+layout(location = 1) in vec3 in_normal;
+layout(location = 2) in vec2 in_tex_coord;
+
+layout(set = 0, binding = 1) uniform sampler2D texSampler;
+
+layout(location = 0) out vec4 out_color;
+
+void main() {
+ // out_color = vec4(1.0);
+ out_color = texture(texSampler, in_tex_coord);
+} \ No newline at end of file
diff --git a/assets/shaders/object.vert b/assets/shaders/object.vert
new file mode 100644
index 0000000..23c0ffb
--- /dev/null
+++ b/assets/shaders/object.vert
@@ -0,0 +1,29 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(location = 0) in vec3 in_position;
+layout(location = 1) in vec3 in_normal;
+layout(location = 2) in vec2 in_tex_coord;
+
+layout(location = 0) out vec3 out_position;
+layout(location = 1) out vec3 out_normal;
+layout(location = 2) out vec2 out_tex_coord;
+
+layout(set = 0, binding = 0) uniform global_object_uniform {
+ mat4 projection;
+ mat4 view;
+}
+global_ubo;
+
+layout(push_constant) uniform push_constants {
+ mat4 model; // 64 bytes
+}
+u_push_constants;
+
+void main() {
+ gl_Position = global_ubo.projection * global_ubo.view * u_push_constants.model *
+ vec4(in_position.x, in_position.y, in_position.z, 1.0);
+ out_position = in_position;
+ out_normal = in_normal;
+ out_tex_coord = in_tex_coord;
+} \ No newline at end of file
diff --git a/assets/shaders/skinned.vert b/assets/shaders/skinned.vert
new file mode 100644
index 0000000..cb2ca85
--- /dev/null
+++ b/assets/shaders/skinned.vert
@@ -0,0 +1,59 @@
+#version 410 core
+// Inputs
+layout (location = 0) in vec3 inPos;
+layout (location = 1) in vec3 inNormal;
+layout (location = 2) in vec2 inTexCoords;
+layout (location = 3) in ivec4 inBoneIndices;
+layout (location = 4) in vec4 inWeights;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+uniform mat4 lightSpaceMatrix;
+
+const int MAX_BONES = 100;
+const int MAX_BONE_INFLUENCES = 4;
+uniform mat4 boneMatrices[MAX_BONES]; // TODO!
+
+// Output
+out VS_OUT {
+ vec3 FragPos;
+ vec3 Normal;
+ vec2 TexCoords;
+ vec4 FragPosLightSpace;
+ vec4 Color;
+} vs_out;
+
+void main() {
+ // vec4 totalPosition = vec4(0.0f);
+ // for(int i = 0 ; i < MAX_BONE_INFLUENCES ; i++) {
+ // if(inBoneIndices[i] == 0)
+ // continue;
+ // if(inBoneIndices[i] >=MAX_BONES)
+ // {
+ // totalPosition = vec4(inPos,1.0f);
+ // break;
+ // }
+ // vec4 localPosition = finalBoneMatrices[inBoneIndices[i]] * vec4(inPos,1.0f);
+ // totalPosition += localPosition * inWeights[i];
+ // vec3 localNormal = mat3(finalBoneMatrices[inBoneIndices[i]]) * inNormal;
+ // vs_out.Normal = localNormal;
+ // }
+
+
+ mat4 skinMatrix = // mat4(1.0)
+ // boneMatrices[int(inBoneIndices.z)]; // should just be the identtiy
+ inWeights.x * boneMatrices[int(inBoneIndices.x)] +
+ inWeights.y * boneMatrices[int(inBoneIndices.y)] +
+ inWeights.z * boneMatrices[int(inBoneIndices.z)] +
+ inWeights.w * boneMatrices[int(inBoneIndices.w)];
+
+ vec4 totalPosition = skinMatrix * vec4(inPos, 1.0);
+
+ vs_out.FragPos = vec3(model * totalPosition);
+ // vs_out.Normal = inNormal;
+ vs_out.TexCoords = inTexCoords;
+ vs_out.FragPosLightSpace = lightSpaceMatrix * vec4(vs_out.FragPos, 1.0);
+ vs_out.Color = inWeights;
+ gl_Position = projection * view * model * totalPosition;
+} \ No newline at end of file