aboutsummaryrefslogtreecommitdiff
path: root/shaders
diff options
context:
space:
mode:
authorvictorfisac <victorfisac@gmail.com>2015-12-21 17:25:22 +0100
committervictorfisac <victorfisac@gmail.com>2015-12-21 17:25:22 +0100
commit1bcb5ddd505e5c4bdac6f254e931e9c3145be88d (patch)
treec71c012feda413d4134a4dd8ac5e7e2bd45b9c61 /shaders
parent4db2da91850fcc55ec08df253e533e236eb91451 (diff)
downloadraylib-1bcb5ddd505e5c4bdac6f254e931e9c3145be88d.tar.gz
raylib-1bcb5ddd505e5c4bdac6f254e931e9c3145be88d.zip
Added lighting engine module
- New lighting engine module which contains new data types Light and Material. These data types and functions facilitates making a basic 3D iluminated program with a light and a model. - Added lighting engine module example (currently included in raylib.h; it might be compiled by separate and include lighting.h in game source C file). - Corrected some opengl defines control structures and added some TODO to fix raylib-opengl 1.1 source build (note: now source can be compiled without errors, but rlglReadPixels() won't work properly). Note: most of functions of phong version 330 shader are not in v100 shaders, so I couldn't write a version 100 phong shader. These functions are included from version 150.
Diffstat (limited to 'shaders')
-rw-r--r--shaders/gl330/phong.fs76
-rw-r--r--shaders/gl330/phong.vs28
2 files changed, 104 insertions, 0 deletions
diff --git a/shaders/gl330/phong.fs b/shaders/gl330/phong.fs
new file mode 100644
index 00000000..bb8826f4
--- /dev/null
+++ b/shaders/gl330/phong.fs
@@ -0,0 +1,76 @@
+#version 330
+
+// Vertex shader input data
+in vec2 fragTexCoord;
+in vec3 fragNormal;
+
+// Diffuse data
+uniform sampler2D texture0;
+uniform vec4 tintColor;
+
+// Light attributes
+uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0);
+uniform vec3 light_diffuseColor = vec3(1, 0.5, 0);
+uniform vec3 light_specularColor = vec3(0, 1, 0);
+uniform float light_intensity = 1;
+uniform float light_specIntensity = 1;
+
+// Material attributes
+uniform vec3 mat_ambientColor = vec3(1, 1, 1);
+uniform vec3 mat_specularColor = vec3(1, 1, 1);
+uniform float mat_glossiness = 50;
+
+// World attributes
+uniform vec3 lightPos;
+uniform vec3 cameraPos;
+
+// Fragment shader output data
+out vec4 fragColor;
+
+vec3 AmbientLighting()
+{
+ return mat_ambientColor * light_ambientColor;
+}
+
+vec3 DiffuseLighting(in vec3 N, in vec3 L)
+{
+ // Lambertian reflection calculation
+ float diffuse = clamp(dot(N, L), 0, 1);
+
+ return tintColor.xyz * light_diffuseColor * light_intensity * diffuse;
+}
+
+vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V)
+{
+ float specular = 0;
+
+ // Calculate specular reflection only if the surface is oriented to the light source
+ if(dot(N, L) > 0)
+ {
+ // Calculate half vector
+ vec3 H = normalize(L + V);
+
+ // Calculate specular intensity
+ specular = pow(dot(N, H), 3 + mat_glossiness);
+ }
+
+ return mat_specularColor * light_specularColor * light_specIntensity * specular;
+}
+
+void main()
+{
+ // Normalize input vectors
+ vec3 L = normalize(lightPos);
+ vec3 V = normalize(cameraPos);
+ vec3 N = normalize(fragNormal);
+
+ vec3 ambient = AmbientLighting();
+ vec3 diffuse = DiffuseLighting(N, L);
+ vec3 specular = SpecularLighting(N, L, V);
+
+ // Get base color from texture
+ vec4 textureColor = texture(texture0, fragTexCoord);
+ vec3 finalColor = textureColor.rgb;
+
+ fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a);
+} \ No newline at end of file
diff --git a/shaders/gl330/phong.vs b/shaders/gl330/phong.vs
new file mode 100644
index 00000000..25163902
--- /dev/null
+++ b/shaders/gl330/phong.vs
@@ -0,0 +1,28 @@
+#version 330
+
+// Vertex input data
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+
+// Projection and model data
+uniform mat4 projectionMatrix;
+uniform mat4 modelviewMatrix;
+uniform mat4 modelMatrix;
+
+// Attributes to fragment shader
+out vec2 fragTexCoord;
+out vec3 fragNormal;
+
+void main()
+{
+ // Send texture coord to fragment shader
+ fragTexCoord = vertexTexCoord;
+
+ // Calculate view vector normal from model
+ mat3 normalMatrix = transpose(inverse(mat3(modelMatrix)));
+ fragNormal = normalize(normalMatrix * vertexNormal);
+
+ // Calculate final vertex position
+ gl_Position = projectionMatrix * modelviewMatrix * vec4(vertexPosition, 1.0);
+} \ No newline at end of file