refmod_test

annotate sdr.ps.glsl @ 0:b469e6a72636

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 18 Feb 2016 23:15:43 +0200
parents
children
rev   line source
nuclear@0 1 #version 110
nuclear@0 2
nuclear@0 3 varying vec3 pos, normal;
nuclear@0 4
nuclear@0 5 uniform float rough, specularity, ior;
nuclear@0 6 uniform float dif_sdr, spec_sdr;
nuclear@0 7
nuclear@0 8 #define DSDR_LAMBERT 0.0
nuclear@0 9 #define DSDR_OREN_NAYAR 1.0
nuclear@0 10
nuclear@0 11 #define SSDR_PHONG 0.0
nuclear@0 12 #define SSDR_BLINN 1.0
nuclear@0 13 #define SSDR_COOK_TORR 2.0
nuclear@0 14
nuclear@0 15 #define EQ(a, b) (abs((a) - (b)) < 0.5)
nuclear@0 16
nuclear@0 17 float lambert(vec3 norm, vec3 ldir);
nuclear@0 18 float oren_nayar(vec3 view, vec3 norm, vec3 ldir, float rough);
nuclear@0 19
nuclear@0 20 float phong(vec3 view, vec3 norm, vec3 ldir, float spow);
nuclear@0 21 float blinn(vec3 norm, vec3 hvec, float spow);
nuclear@0 22 float cook_torrance(vec3 view, vec3 norm, vec3 ldir, vec3 hvec, float rough, float ior);
nuclear@0 23
nuclear@0 24 void main()
nuclear@0 25 {
nuclear@0 26 vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
nuclear@0 27 float idiff, ispec;
nuclear@0 28
nuclear@0 29 vec3 view = -normalize(pos);
nuclear@0 30 vec3 norm = normalize(normal);
nuclear@0 31 vec3 ldir = normalize(gl_LightSource[0].position.xyz - pos);
nuclear@0 32
nuclear@0 33 if(EQ(dif_sdr, DSDR_LAMBERT)) {
nuclear@0 34 idiff = lambert(norm, ldir);
nuclear@0 35 } else if(EQ(dif_sdr, DSDR_OREN_NAYAR)) {
nuclear@0 36 idiff = oren_nayar(view, norm, ldir, rough);
nuclear@0 37 } else {
nuclear@0 38 idiff = 0.0;
nuclear@0 39 }
nuclear@0 40
nuclear@0 41 vec4 mcolor = gl_FrontMaterial.diffuse;
nuclear@0 42
nuclear@0 43 if(EQ(spec_sdr, SSDR_PHONG)) {
nuclear@0 44 ispec = phong(view, norm, ldir, gl_FrontMaterial.shininess);
nuclear@0 45 color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec;
nuclear@0 46 } else if(EQ(spec_sdr, SSDR_BLINN)) {
nuclear@0 47 ispec = blinn(norm, gl_LightSource[0].halfVector.xyz, gl_FrontMaterial.shininess);
nuclear@0 48 color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec;
nuclear@0 49 } else if(EQ(spec_sdr, SSDR_COOK_TORR)) {
nuclear@0 50 ispec = cook_torrance(view, norm, ldir, gl_LightSource[0].halfVector.xyz, rough, ior);
nuclear@0 51 color = specularity * ispec * mcolor + (1.0 - specularity) * idiff * mcolor;
nuclear@0 52 } else {
nuclear@0 53 color = vec4(1.0, 0.0, 0.0, 1.0);
nuclear@0 54 }
nuclear@0 55 color.a = 1.0;
nuclear@0 56
nuclear@0 57 gl_FragColor = color;
nuclear@0 58 }