nuclear@0: #version 110 nuclear@0: nuclear@0: varying vec3 pos, normal; nuclear@0: nuclear@0: uniform float rough, specularity, ior; nuclear@0: uniform float dif_sdr, spec_sdr; nuclear@0: nuclear@0: #define DSDR_LAMBERT 0.0 nuclear@0: #define DSDR_OREN_NAYAR 1.0 nuclear@0: nuclear@0: #define SSDR_PHONG 0.0 nuclear@0: #define SSDR_BLINN 1.0 nuclear@0: #define SSDR_COOK_TORR 2.0 nuclear@0: nuclear@0: #define EQ(a, b) (abs((a) - (b)) < 0.5) nuclear@0: nuclear@0: float lambert(vec3 norm, vec3 ldir); nuclear@0: float oren_nayar(vec3 view, vec3 norm, vec3 ldir, float rough); nuclear@0: nuclear@0: float phong(vec3 view, vec3 norm, vec3 ldir, float spow); nuclear@0: float blinn(vec3 norm, vec3 hvec, float spow); nuclear@0: float cook_torrance(vec3 view, vec3 norm, vec3 ldir, vec3 hvec, float rough, float ior); nuclear@0: nuclear@0: void main() nuclear@0: { nuclear@0: vec4 color = vec4(1.0, 1.0, 1.0, 1.0); nuclear@0: float idiff, ispec; nuclear@0: nuclear@0: vec3 view = -normalize(pos); nuclear@0: vec3 norm = normalize(normal); nuclear@0: vec3 ldir = normalize(gl_LightSource[0].position.xyz - pos); nuclear@0: nuclear@0: if(EQ(dif_sdr, DSDR_LAMBERT)) { nuclear@0: idiff = lambert(norm, ldir); nuclear@0: } else if(EQ(dif_sdr, DSDR_OREN_NAYAR)) { nuclear@0: idiff = oren_nayar(view, norm, ldir, rough); nuclear@0: } else { nuclear@0: idiff = 0.0; nuclear@0: } nuclear@0: nuclear@0: vec4 mcolor = gl_FrontMaterial.diffuse; nuclear@0: nuclear@0: if(EQ(spec_sdr, SSDR_PHONG)) { nuclear@0: ispec = phong(view, norm, ldir, gl_FrontMaterial.shininess); nuclear@0: color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec; nuclear@0: } else if(EQ(spec_sdr, SSDR_BLINN)) { nuclear@0: ispec = blinn(norm, gl_LightSource[0].halfVector.xyz, gl_FrontMaterial.shininess); nuclear@0: color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec; nuclear@0: } else if(EQ(spec_sdr, SSDR_COOK_TORR)) { nuclear@0: ispec = cook_torrance(view, norm, ldir, gl_LightSource[0].halfVector.xyz, rough, ior); nuclear@0: color = specularity * ispec * mcolor + (1.0 - specularity) * idiff * mcolor; nuclear@0: } else { nuclear@0: color = vec4(1.0, 0.0, 0.0, 1.0); nuclear@0: } nuclear@0: color.a = 1.0; nuclear@0: nuclear@0: gl_FragColor = color; nuclear@0: }