#version 410 layout(location = 0) in vec3 colorin; layout(location = 1) in vec3 normal; layout(location = 2) in vec3 pos; layout(location = 3) in vec4 lightviewpos[3]; layout(location = 8) in vec2 UV; uniform int numLights; uniform sampler2D ShadowMaps[3]; uniform vec3 lightpos[3]; uniform vec3 lightColor[3]; layout(location = 0) out vec4 colorOut; layout(location = 1) out float depth; const float ambientFactor = 0.25; const float diffuseFactor = 0.5; const float specFactor = 1.0; const float shininess = 16.0; const float screenGamma = 2.2; const float pitl = 2*3.14159265359 / 16.0; const float circlelength = 700.0; bool isVisible(int i, vec2 offs, float lambertian) { float bias = 0.005*tan(acos(lambertian)); bias = clamp(bias,0.0,0.01);//*tan(acos(dot(normal,-normalize(lightpos[i] - pos.xyz)))); return !(texture(ShadowMaps[i],lightviewpos[i].xy + offs).x < (lightviewpos[i].z - bias)); } void main() { vec3 colorLinear = ambientFactor * colorin; for(int i = 0; i < numLights; i++){ vec3 lightDir = -normalize(lightpos[i] - pos.xyz); float lambertian = max(dot(normalize(normal),lightDir),0.0); float cosTheta = clamp(dot(normalize(normal),-lightDir), 0.0, 1.0); float specular = 0; vec3 viewDir = normalize(-pos.xyz); vec3 halfDir = normalize(lightDir + viewDir); float specAngle = max(dot(halfDir, normalize(normal)), 0.0); specular = int(lambertian > 0)*pow(specAngle, shininess); //int visible = int(!(texture(ShadowMaps,lightpos[i].xy/2 + vec2(0.5,0.5)).z < (lightpos[i].z))); float visible = 0; for(int j = 0; j < 4; j++){ vec2 offs = vec2(cos(j*4*pitl),sin(j*4*pitl)) / circlelength; visible += float(isVisible(i, offs,cosTheta)) * 1.0/16.0; } if(visible == 0.25) visible = 1.0; else visible = 0; for(int j = 0; j < 16; j++){ vec2 offs = vec2(cos(j*pitl),sin(j*pitl)) / circlelength; visible += float(isVisible(i, offs,cosTheta)) * 1.0/16.0; } colorLinear += (visible * 0.5 + 0.5) *(lambertian * diffuseFactor * colorin * lightColor[i] + specular * specFactor*colorin); colorLinear /= dot(lightpos[i] - pos.xyz, lightpos[i] - pos.xyz)/200; //colorLinear = vec3(visible * specular); } vec3 colorGammaCorrected = colorLinear;//pow(colorLinear, vec3(1.0/screenGamma)); //colorOut = vec4(colorin, 1.0)*max(dot(normal,normalize(vec3(0.0,0.0,10.0)-pos)),0.0); colorOut = vec4(colorGammaCorrected,1.0) * float(gl_FragCoord.y <= 768 && gl_FragCoord.x <= 1024 && gl_FragCoord.x >= 0 && gl_FragCoord.y >= 0); depth = gl_FragCoord.z; }