nuclear@61: uniform sampler2D mrt0, mrt1, mrt2; nuclear@30: uniform vec2 tex_scale, fb_size; nuclear@30: nuclear@33: uniform vec3 light_color; nuclear@33: uniform float light_radius; nuclear@33: nuclear@34: varying vec3 vpos, ltpos; nuclear@29: nuclear@29: void main() nuclear@29: { nuclear@30: vec2 tc = gl_FragCoord.xy * tex_scale / fb_size; nuclear@29: nuclear@34: // MRT0 - rgb: position, a: shininess nuclear@34: vec4 texel0 = texture2D(mrt0, tc); nuclear@34: vec3 pos = texel0.xyz; nuclear@34: float shin = texel0.w; nuclear@34: nuclear@34: // MRT1 - rgb: normal nuclear@30: vec3 norm = texture2D(mrt1, tc).xyz; nuclear@30: nuclear@34: // MRT2 - rgb: diffuse color, a: specular intensity nuclear@30: vec4 texel3 = texture2D(mrt2, tc); nuclear@30: vec3 dcol = texel3.xyz; nuclear@34: vec3 scol = texel3.www; nuclear@30: nuclear@30: vec3 ldir = ltpos - pos; nuclear@33: float light_dist = length(ldir); nuclear@30: ldir = normalize(ldir); nuclear@30: nuclear@34: // diffuse nuclear@34: float ndotl = max(dot(norm, ldir), 0.0); nuclear@34: vec3 color_diffuse = dcol * ndotl; nuclear@34: nuclear@34: // specular nuclear@34: vec3 vdir = -normalize(vpos); nuclear@34: vec3 halfvec = normalize(vdir + ldir); nuclear@34: float ndoth = max(dot(norm, halfvec), 0.0); nuclear@34: vec3 color_specular = scol * pow(ndoth, shin); nuclear@30: nuclear@33: float atten = 1.0 - light_dist / light_radius; nuclear@33: atten = clamp(atten, 0.0, 1.0); nuclear@29: nuclear@34: vec3 color = (color_diffuse + color_specular) * light_color * atten; nuclear@34: gl_FragColor = vec4(color, 1.0); nuclear@29: }