|
1 |
| -uniform sampler2D baseTexture; |
2 |
| -uniform sampler2D normalTexture; |
3 |
| -uniform sampler2D useNormalmap; |
4 |
| - |
5 |
| -uniform vec4 skyBgColor; |
6 |
| -uniform float fogDistance; |
7 |
| -uniform vec3 eyePosition; |
8 |
| - |
9 |
| -varying vec3 vPosition; |
10 |
| -varying vec3 eyeVec; |
11 |
| - |
12 |
| -#ifdef ENABLE_PARALLAX_OCCLUSION |
13 |
| -varying vec3 tsEyeVec; |
14 |
| -#endif |
15 |
| - |
16 |
| -const float e = 2.718281828459; |
17 |
| - |
18 |
| -void main (void) |
19 |
| -{ |
20 |
| - vec3 color; |
21 |
| - vec2 uv = gl_TexCoord[0].st; |
22 |
| - |
23 |
| -#ifdef USE_NORMALMAPS |
24 |
| - float use_normalmap = texture2D(useNormalmap,vec2(1.0,1.0)).r; |
25 |
| -#endif |
26 |
| - |
27 |
| -#ifdef ENABLE_PARALLAX_OCCLUSION |
28 |
| - float height; |
29 |
| - vec2 tsEye = vec2(tsEyeVec.x,-tsEyeVec.y); |
30 |
| - |
31 |
| - if (use_normalmap > 0.0) { |
32 |
| - float map_height = texture2D(normalTexture, uv).a; |
33 |
| - if (map_height < 1.0){ |
34 |
| - float height = PARALLAX_OCCLUSION_SCALE * map_height - PARALLAX_OCCLUSION_BIAS; |
35 |
| - uv = uv + height * tsEye; |
36 |
| - } |
37 |
| - } |
38 |
| -#endif |
39 |
| - |
40 |
| -#ifdef ENABLE_BUMPMAPPING |
41 |
| - if (use_normalmap > 0.0) { |
42 |
| - vec3 base = texture2D(baseTexture, uv).rgb; |
43 |
| - vec3 vVec = normalize(eyeVec); |
44 |
| - vec3 bump = normalize(texture2D(normalTexture, uv).xyz * 2.0 - 1.0); |
45 |
| - vec3 R = reflect(-vVec, bump); |
46 |
| - vec3 lVec = normalize(vVec); |
47 |
| - float diffuse = max(dot(lVec, bump), 0.0); |
48 |
| - float specular = pow(clamp(dot(R, lVec), 0.0, 1.0),1.0); |
49 |
| - color = mix (base,diffuse*base,1.0) + 0.1 * specular * diffuse; |
50 |
| - } else { |
51 |
| - color = texture2D(baseTexture, uv).rgb; |
52 |
| - } |
53 |
| -#else |
54 |
| - color = texture2D(baseTexture, uv).rgb; |
55 |
| -#endif |
56 |
| - |
57 |
| - float alpha = texture2D(baseTexture, uv).a; |
58 |
| - vec4 col = vec4(color.r, color.g, color.b, alpha); |
59 |
| - col *= gl_Color; |
60 |
| - col = col * col; // SRGB -> Linear |
61 |
| - col *= 1.8; |
62 |
| - col.r = 1.0 - exp(1.0 - col.r) / e; |
63 |
| - col.g = 1.0 - exp(1.0 - col.g) / e; |
64 |
| - col.b = 1.0 - exp(1.0 - col.b) / e; |
65 |
| - col = sqrt(col); // Linear -> SRGB |
66 |
| - if(fogDistance != 0.0){ |
67 |
| - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); |
68 |
| - col = mix(col, skyBgColor, d); |
69 |
| - } |
70 |
| - gl_FragColor = vec4(col.r, col.g, col.b, alpha); |
71 |
| -} |
| 1 | +uniform sampler2D baseTexture; |
| 2 | +uniform sampler2D normalTexture; |
| 3 | +uniform sampler2D useNormalmap; |
| 4 | + |
| 5 | +uniform vec4 skyBgColor; |
| 6 | +uniform float fogDistance; |
| 7 | +uniform vec3 eyePosition; |
| 8 | + |
| 9 | +varying vec3 vPosition; |
| 10 | +varying vec3 worldPosition; |
| 11 | + |
| 12 | +varying vec3 eyeVec; |
| 13 | +varying vec3 tsEyeVec; |
| 14 | +varying vec3 lightVec; |
| 15 | +varying vec3 tsLightVec; |
| 16 | + |
| 17 | +bool normalTexturePresent = false; |
| 18 | + |
| 19 | +const float e = 2.718281828459; |
| 20 | + |
| 21 | +float intensity (vec3 color){ |
| 22 | + return (color.r + color.g + color.b) / 3.0; |
| 23 | +} |
| 24 | + |
| 25 | +float get_rgb_height (vec2 uv){ |
| 26 | + return intensity(texture2D(baseTexture,uv).rgb); |
| 27 | +} |
| 28 | + |
| 29 | +vec4 get_normal_map(vec2 uv){ |
| 30 | + vec4 bump = texture2D(normalTexture, uv).rgba; |
| 31 | + bump.xyz = normalize(bump.xyz * 2.0 -1.0); |
| 32 | + bump.y = -bump.y; |
| 33 | + return bump; |
| 34 | +} |
| 35 | + |
| 36 | +void main (void) |
| 37 | +{ |
| 38 | + vec3 color; |
| 39 | + vec4 bump; |
| 40 | + vec2 uv = gl_TexCoord[0].st; |
| 41 | + bool use_normalmap = false; |
| 42 | + |
| 43 | +#ifdef USE_NORMALMAPS |
| 44 | + if (texture2D(useNormalmap,vec2(1.0,1.0)).r > 0.0){ |
| 45 | + normalTexturePresent = true; |
| 46 | + } |
| 47 | +#endif |
| 48 | + |
| 49 | +#ifdef ENABLE_PARALLAX_OCCLUSION |
| 50 | + if (normalTexturePresent){ |
| 51 | + vec3 tsEye = normalize(tsEyeVec); |
| 52 | + float height = PARALLAX_OCCLUSION_SCALE * texture2D(normalTexture, uv).a - PARALLAX_OCCLUSION_BIAS; |
| 53 | + uv = uv + texture2D(normalTexture, uv).z * height * vec2(tsEye.x,-tsEye.y); |
| 54 | + } |
| 55 | +#endif |
| 56 | + |
| 57 | +#ifdef USE_NORMALMAPS |
| 58 | + if (normalTexturePresent){ |
| 59 | + bump = get_normal_map(uv); |
| 60 | + use_normalmap = true; |
| 61 | + } |
| 62 | +#endif |
| 63 | + |
| 64 | +#ifdef GENERATE_NORMALMAPS |
| 65 | + if (use_normalmap == false){ |
| 66 | + float tl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y+SAMPLE_STEP)); |
| 67 | + float t = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); |
| 68 | + float tr = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y+SAMPLE_STEP)); |
| 69 | + float r = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y)); |
| 70 | + float br = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y-SAMPLE_STEP)); |
| 71 | + float b = get_rgb_height (vec2(uv.x,uv.y-SAMPLE_STEP)); |
| 72 | + float bl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); |
| 73 | + float l = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y)); |
| 74 | + float dX = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl); |
| 75 | + float dY = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr); |
| 76 | + bump = vec4 (normalize(vec3 (dX, -dY, NORMALMAPS_STRENGTH)),1.0); |
| 77 | + use_normalmap = true; |
| 78 | + } |
| 79 | +#endif |
| 80 | + |
| 81 | +vec4 base = texture2D(baseTexture, uv).rgba; |
| 82 | + |
| 83 | +#ifdef ENABLE_BUMPMAPPING |
| 84 | + if (use_normalmap){ |
| 85 | + vec3 L = normalize(lightVec); |
| 86 | + vec3 E = normalize(eyeVec); |
| 87 | + float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0),0.5); |
| 88 | + float diffuse = dot(E,bump.xyz); |
| 89 | + color = 0.05*base.rgb + diffuse*base.rgb + 0.2*specular*base.rgb; |
| 90 | + } else { |
| 91 | + color = base.rgb; |
| 92 | + } |
| 93 | +#else |
| 94 | + color = base.rgb; |
| 95 | +#endif |
| 96 | + |
| 97 | + vec4 col = vec4(color.rgb, base.a); |
| 98 | + col = col * col; // SRGB -> Linear |
| 99 | + col *= 1.8; |
| 100 | + col.r = 1.0 - exp(1.0 - col.r) / e; |
| 101 | + col.g = 1.0 - exp(1.0 - col.g) / e; |
| 102 | + col.b = 1.0 - exp(1.0 - col.b) / e; |
| 103 | + col = sqrt(col); // Linear -> SRGB |
| 104 | + col *= gl_Color; |
| 105 | + if(fogDistance != 0.0){ |
| 106 | + float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); |
| 107 | + col = mix(col, skyBgColor, d); |
| 108 | + } |
| 109 | + gl_FragColor = vec4(col.rgb, base.a); |
| 110 | +} |
0 commit comments