1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
</copyright> */
#ifdef GL_ES
precision highp float;
#endif
// lighting uniforms
uniform vec3 u_lightPos;
uniform vec4 u_lightDiff;
uniform vec4 u_lightAmb;
// diffuse map
uniform sampler2D colMap;
// environment map
uniform sampler2D envMap;
// normal map
uniform sampler2D normalMap;
//material uniforms
uniform vec4 u_matAmbient;
uniform vec4 u_matDiffuse;
uniform vec4 u_matSpecular;
uniform float u_matShininess;
uniform vec4 u_matEmission;
uniform float u_renderGlow;
// varyings
varying vec4 vNormal; // w = texcoord.x
varying vec4 vECPos; // w = texcoord.y
varying vec3 vEyePos;
void main()
{
vec4 colMapTexel = vec4(texture2D(colMap, vec2(vNormal.w, 1.0 - vECPos.w)).rgb, 1.0);
// normal mapping
vec3 normal = normalize(vNormal.xyz);
vec3 mapNormal = texture2D(normalMap, vec2(vNormal.w, vECPos.w)).xyz * 2.0 - 1.0;
mapNormal = normalize(mapNormal.x*vec3(normal.z, 0.0, -normal.x) + vec3(0.0, mapNormal.y, 0.0) + mapNormal.z*normal);
// create envmap coordinates
vec3 r = reflect( normalize(vec3(vECPos.xyz - vEyePos.xyz)), mapNormal);
float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + r.z*r.z );
// calculate environment map texel
vec4 envMapTexel = vec4(texture2D(envMap, vec2(r.x/m + 0.5, r.y/m + 0.5)).rgb, 0.0);
// lighting
vec3 lightDirection = u_lightPos - vECPos.xyz;
float lightDist = length(lightDirection);
lightDirection /= lightDist;
float attenuation = clamp(1.0 - lightDist * 0.01, 0.0, 1.0);
vec3 halfVec = normalize(lightDirection + vEyePos);
float diffuseIntensity = max(0.0, dot(mapNormal, lightDirection));
float specularModifier = max(0.0, dot(mapNormal, halfVec));
float pf;
if(diffuseIntensity == 0.0)
pf = 0.0;
else
pf = pow(specularModifier, 76.0);
vec4 ambient = u_matAmbient * u_lightAmb;
vec4 diffuse = u_matDiffuse * (colMapTexel + envMapTexel);
if (u_renderGlow <= 0.5)
diffuse *= u_lightDiff * diffuseIntensity * attenuation;
vec4 specular = 2.0 * pf * envMapTexel;
gl_FragColor = (colMapTexel*(ambient + diffuse)) + specular + vec4(0.0,0.0,0.0,1.0);
}
|