summaryrefslogtreecommitdiff
path: root/advanced_lighting/6.hdr/shaders/blinn.frag
diff options
context:
space:
mode:
Diffstat (limited to 'advanced_lighting/6.hdr/shaders/blinn.frag')
-rw-r--r--advanced_lighting/6.hdr/shaders/blinn.frag54
1 files changed, 54 insertions, 0 deletions
diff --git a/advanced_lighting/6.hdr/shaders/blinn.frag b/advanced_lighting/6.hdr/shaders/blinn.frag
new file mode 100644
index 0000000..5dca1f7
--- /dev/null
+++ b/advanced_lighting/6.hdr/shaders/blinn.frag
@@ -0,0 +1,54 @@
+#version 330 core
+
+in VS_OUT {
+ vec3 fpos;
+ vec3 fn;
+ vec2 texc;
+} fsin;
+
+out vec4 fcolor;
+
+uniform sampler2D diftex;
+
+const int lmax = 30;
+
+uniform int lcount;
+uniform vec3 lpos[lmax];
+uniform vec3 vpos;
+
+void main(void)
+{
+ vec3 l, v, n, difcolor, lcolor, ambient, halfdir, result;
+ float diff, spec, specf, dist, attenuation;
+ int i;
+
+ n = normalize(fsin.fn);
+ v = normalize(vpos-fsin.fpos);
+
+ ambient = vec3(0.001);
+
+ difcolor = vec3(texture(diftex, fsin.texc));
+
+ /* lcolor = vec3(0.3, 0.0, 0.1); */
+ lcolor = vec3(1.0);
+
+ specf = 0.2;
+
+ result = vec3(0.0);
+
+ for (i = 0; i < lcount; i++) {
+ l = normalize(lpos[i]-fsin.fpos);
+ halfdir = normalize(l+v);
+
+ diff = max(dot(n, l), 0.0);
+
+ spec = pow(max(dot(n, halfdir), 0.0), 16.0)*specf;
+
+ dist = length(lpos[i]-fsin.fpos);
+ attenuation = 1.0/dist;
+
+ result += (diff+spec)*difcolor*lcolor*attenuation;
+ }
+
+ fcolor = vec4(ambient+result, 1.0);
+}