dungeon_crawler

annotate prototype/sdr/deferred_omni.p.glsl @ 61:4472ef41a209

forgot an extra mrt uniform in deferred_omni.p.glsl
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 25 Sep 2012 06:37:56 +0300
parents 85734f319626
children
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 }