rev |
line source |
nuclear@61
|
1 uniform sampler2D mrt0, mrt1, mrt2;
|
nuclear@30
|
2 uniform vec2 tex_scale, fb_size;
|
nuclear@30
|
3
|
nuclear@33
|
4 uniform vec3 light_color;
|
nuclear@33
|
5 uniform float light_radius;
|
nuclear@33
|
6
|
nuclear@34
|
7 varying vec3 vpos, ltpos;
|
nuclear@29
|
8
|
nuclear@29
|
9 void main()
|
nuclear@29
|
10 {
|
nuclear@30
|
11 vec2 tc = gl_FragCoord.xy * tex_scale / fb_size;
|
nuclear@29
|
12
|
nuclear@34
|
13 // MRT0 - rgb: position, a: shininess
|
nuclear@34
|
14 vec4 texel0 = texture2D(mrt0, tc);
|
nuclear@34
|
15 vec3 pos = texel0.xyz;
|
nuclear@34
|
16 float shin = texel0.w;
|
nuclear@34
|
17
|
nuclear@34
|
18 // MRT1 - rgb: normal
|
nuclear@30
|
19 vec3 norm = texture2D(mrt1, tc).xyz;
|
nuclear@30
|
20
|
nuclear@34
|
21 // MRT2 - rgb: diffuse color, a: specular intensity
|
nuclear@30
|
22 vec4 texel3 = texture2D(mrt2, tc);
|
nuclear@30
|
23 vec3 dcol = texel3.xyz;
|
nuclear@34
|
24 vec3 scol = texel3.www;
|
nuclear@30
|
25
|
nuclear@30
|
26 vec3 ldir = ltpos - pos;
|
nuclear@33
|
27 float light_dist = length(ldir);
|
nuclear@30
|
28 ldir = normalize(ldir);
|
nuclear@30
|
29
|
nuclear@34
|
30 // diffuse
|
nuclear@34
|
31 float ndotl = max(dot(norm, ldir), 0.0);
|
nuclear@34
|
32 vec3 color_diffuse = dcol * ndotl;
|
nuclear@34
|
33
|
nuclear@34
|
34 // specular
|
nuclear@34
|
35 vec3 vdir = -normalize(vpos);
|
nuclear@34
|
36 vec3 halfvec = normalize(vdir + ldir);
|
nuclear@34
|
37 float ndoth = max(dot(norm, halfvec), 0.0);
|
nuclear@34
|
38 vec3 color_specular = scol * pow(ndoth, shin);
|
nuclear@30
|
39
|
nuclear@33
|
40 float atten = 1.0 - light_dist / light_radius;
|
nuclear@33
|
41 atten = clamp(atten, 0.0, 1.0);
|
nuclear@29
|
42
|
nuclear@34
|
43 vec3 color = (color_diffuse + color_specular) * light_color * atten;
|
nuclear@34
|
44 gl_FragColor = vec4(color, 1.0);
|
nuclear@29
|
45 }
|