varying vec3 norm, l0dir, hv[2]; #vertex void main() { norm = normalize(gl_NormalMatrix * gl_Normal); l0dir = normalize(vec3(gl_LightSource[0].position)); hv[0] = normalize(gl_LightSource[0].halfVector.xyz); hv[1] = normalize(gl_LightSource[1].halfVector.xyz); gl_Position = ftransform(); } #fragment uniform sampler2D env; uniform float reflex; void main() { vec3 np = normalize(vec3(gl_FragCoord)); vec3 nn = normalize(norm); // + noise3(np * 10.0)); vec2 ec; float i, r, s; // phong lighting i = 0.3 * dot(nn, normalize(l0dir)); if (i > 0.0) s = 0.5 * pow(max(dot(nn, normalize(hv[0])), 0.0), 64.0); else { i *= -0.5; s = 0.3 * pow(max(dot(nn, normalize(hv[1])), 0.0), 64.0); } i += 0.1; // fake cube-mapped reflections nn = abs(gl_NormalMatrix * (nn + np)); nn /= max(max(nn.x, nn.y), nn.z); if (nn.z > 0.999) ec = vec2(nn); else ec = vec2(nn.x + nn.y, nn.z); // combine it all r = i + s + reflex * texture2D(env, ec * 8.0).r; i += s; gl_FragColor = vec4(r, i, i, 1.0); }