#version 330 core in VS_OUT { vec3 fpos; vec3 fn; vec2 texc; } fsin; out vec4 fcolor; uniform sampler2D diftex; const int lmax = 30; uniform int lcount; uniform vec3 lpos[lmax]; uniform vec3 vpos; void main(void) { vec3 l, v, n, difcolor, lcolor, ambient, halfdir, result; float diff, spec, specf, dist, attenuation; int i; n = normalize(fsin.fn); v = normalize(vpos-fsin.fpos); ambient = vec3(0.001); difcolor = vec3(texture(diftex, fsin.texc)); /* lcolor = vec3(0.3, 0.0, 0.1); */ lcolor = vec3(1.0); specf = 0.2; result = vec3(0.0); for (i = 0; i < lcount; i++) { l = normalize(lpos[i]-fsin.fpos); halfdir = normalize(l+v); diff = max(dot(n, l), 0.0); spec = pow(max(dot(n, halfdir), 0.0), 16.0)*specf; dist = length(lpos[i]-fsin.fpos); attenuation = 1.0/dist; result += (diff+spec)*difcolor*lcolor*attenuation; } fcolor = vec4(ambient+result, 1.0); }