// Z range (relative to camera) must be 3..7 varying vec3 n, rn, rv; varying float z; #vertex void main() { // vertex position vec4 v = gl_ModelViewMatrix * gl_Vertex; gl_Position = gl_ProjectionMatrix * v; // normal vector n = normalize(gl_NormalMatrix * gl_Normal); // generate some varyings rn = gl_Normal; rv = gl_Vertex.xyz; z = -0.25 * (v.z + 3.0); } #fragment uniform sampler2D tex; vec3 smpl(in vec3 en, in vec2 tc) { return 0.5 * dot(rn, en) * (texture2D(tex, 0.5 * tc + vec2(0.5, 0.5)).xyz - vec3(0.5, 0.5, 0.5)); } void main() { vec3 nn; nn = normalize(normalize(n) + smpl(vec3(1.0, 0.0, 0.0), rv.yz) + smpl(vec3(0.0, 1.0, 0.0), rv.xz) + smpl(vec3(0.0, 0.0, 1.0), rv.xy)); gl_FragColor = vec4(0.5 * nn + vec3(0.5, 0.5, 0.5), z); }