Files
qad/qglview/shaders/ppl.frag

180 lines
7.4 KiB
GLSL

#version 130
#define lc 4
varying vec4 diffuse[lc], pos, spos;//, ambient;//, col;
varying vec3 lightDir[lc]/*halfVector[lc], */;
//varying vec3 lightDir[lc]/*halfVector[lc], */;
varying vec3 normal, srcn;
varying float fogCoord, alpha;
uniform int lightsCount;
uniform bool acc_light, acc_fog, has_diffuse, has_bump, is_glass, shadows, soft_shadows;
uniform float bump_scale, reflectivity, iof, cdis;
uniform vec2 vsize;
uniform sampler2D t0, t1, t2;
uniform sampler2D s0;
uniform samplerCube tc, tc0;
uniform mat4 mat;
float light_diffuse(vec3 l, vec3 n, vec3 h, vec3 v, float shininess);
float light_specular(vec3 l, vec3 n, vec3 h, vec3 v, float shininess);
const float bias = 1.;
vec2 sp;
vec4 sc, dc;//ambient;
void calcLight(in int index, in vec3 n, in vec3 v) {
vec2 scoord, sdt, sdt2;
vec3 halfV, ldir;
vec4 lpos = gl_LightSource[index].position;
float spot, ldist = length(lpos.xyz - pos.xyz), shadow = 1., sdep, ddep;
ldir = normalize(lpos.xyz - (pos.xyz * lpos.w));
halfV = normalize(ldir + v);
//if (dot(ldir, n) > 0) {
spot = step(0., dot(ldir, n));
if (gl_LightSource[index].spotCutoff < 180.) {
spot = max(dot(-ldir, gl_LightSource[index].spotDirection.xyz), 0.);
spot *= step(gl_LightSource[index].spotExponent, spot);
spot = pow(spot, (gl_LightSource[index].spotCosCutoff + 0.001));
if (spot > 0. && shadows) {
scoord = (spos.xyz / spos.w).xy / 2 + vec2(0.5);
sdep = texture(s0, scoord.xy).r + bias;
ddep = pow((spos.z - sdep) / 4., 0.5) * 2.;
shadow = clamp(sdep - spos.z, 0., 1.);
if (soft_shadows) {
sdt = ddep / vsize;
sdt2 = sdt + sdt;
shadow += (clamp(texture(s0, scoord.xy + vec2(sdt.x, 0.)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, 0.)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, 0)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, 0)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt2.x, 0)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, sdt2.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt2.x, 0)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(0, -sdt2.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt2.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt2.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt2.x, -sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt2.x, sdt.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, sdt2.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(sdt.x, -sdt2.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, -sdt2.y)).r + bias - spos.z, 0., 1.) +
clamp(texture(s0, scoord.xy + vec2(-sdt.x, sdt2.y)).r + bias - spos.z, 0., 1.)) / 29.;
shadow = clamp(pow(shadow, 0.5), 0., 1);
}
spot *= shadow;
}
}
spot /= (gl_LightSource[index].constantAttenuation + ldist * (gl_LightSource[index].linearAttenuation + ldist * gl_LightSource[index].quadraticAttenuation));
dc += spot * diffuse[index] * light_diffuse(ldir, n, halfV, v, gl_FrontMaterial.shininess);
sc += spot * gl_FrontMaterial.specular * gl_LightSource[index].specular * light_specular(ldir, n, halfV, v, gl_FrontMaterial.shininess);
//}
}
void main(void) {
/*vec3 scoord = spos.xyz / spos.w;
float sdep = texture(s0, scoord.xy / 2 + vec2(0.5)).r + 1;
//gl_FragColor.rgb = vec3(step(spos.z, sdep));
gl_FragColor.rgb = vec3(spos.z - sdep)/10;
//gl_FragColor.rgb = vec3(texture(s0, scoord.xy+vec2(0.5)).r/100);
//gl_FragColor.rgb = vec3(texture(s0,).r/100);
return;*/
//bias = (vsize.x - vsize.y) / max(vsize.x, vsize.y)*5 - 1.;
if (!acc_light) {
if (has_diffuse) gl_FragColor = texture2D(t0, gl_TexCoord[0].xy);
//else gl_FragColor = gl_Color;
if (acc_fog)
gl_FragColor.xyz = mix(gl_FragColor.xyz, gl_Fog.color.xyz, fogCoord);
return;
}
sp = gl_FragCoord.xy / vsize;
vec3 n, v = normalize(-pos.xyz);
//v.xy = vec2(1,1)-gl_FragCoord.xy / vsize*2 ;//- vec2(1,1);
if (has_bump) n = normalize(normal + (texture2D(t1, gl_TexCoord[0].xy).xyz - vec3(0.5, 0.5, 1.)) * bump_scale);
else n = normalize(normal);
vec4 color;
sc = vec4(0.);
dc = gl_LightModel.ambient * gl_FrontMaterial.ambient;//ambient;
if (lightsCount > 0) {
calcLight(0, n, v);
if (lightsCount > 1) {
calcLight(1, n, v);
if (lightsCount > 2) {
calcLight(2, n, v);
if (lightsCount > 3) {
calcLight(3, n, v);
/*if (lightsCount > 4) {
calcLight(4, n, v);
if (lightsCount > 5) {
calcLight(5, n, v);
if (lightsCount > 6) {
calcLight(6, n, v);
if (lightsCount > 7) {
calcLight(7, n, v);
}
}
}
}*/
}
}
}
}
sc = max(sc, vec4(0.));
vec2 spr = sp, spg = sp, spb = sp, spc = sp, spm = sp, spy = sp, dsp;
vec3 bgf;
float fresnel = pow(1. - max(dot(v, n), 0.), 1);
dsp = fresnel * n.xy * (1. - iof);
spg += dsp;
if (cdis > 0.) {
spr += dsp * (1. - cdis - cdis);
spy += dsp * (1. - cdis);
spc += dsp * (1. + cdis);
spb += dsp * (1. + cdis + cdis);
vec3 bg0 = texture2D(t2, spr).rgb, bg1 = texture2D(t2, spy).rgb, bg2 = texture2D(t2, spg).rgb, bg3 = texture2D(t2, spc).rgb, bg4 = texture2D(t2, spb).rgb;
//bgf = vec3(bg0.r, bg2.g, bg4.b);
bgf = vec3((bg0.r + bg1.r) / 2., (bg1.g + bg2.g + bg3.g) / 3., (bg3.b + bg4.b) / 2.);
} else bgf = texture2D(t2, spg).rgb;
if (has_diffuse) {
vec4 tex = texture2D(t0, gl_TexCoord[0].xy);
dc *= tex;
color.a = tex.a * alpha;
} else color.a = alpha;
color.rgb = dc.rgb;
vec3 ln = vec3(0);
if (is_glass) {
ln = reflect(v, n);
ln = ln * mat3(gl_ModelViewMatrix);
ln.y = -ln.y;
color.rgb = (mix(bgf, textureCube(tc, ln).rgb, 0.2 + fresnel * 0.8) * gl_FrontMaterial.diffuse.rgb + gl_FrontMaterial.emission.rgb) + sc.rgb * color.a;
color.a = 1.;
} else {
if (reflectivity > 0.) {
ln = reflect(v, n);
ln = ln * mat3(gl_ModelViewMatrix);
ln.y = -ln.y;
color.rgb = mix(color.rgb, textureCube(tc, ln).rgb, reflectivity);
}
color.rgb = mix(color.rgb * gl_FrontMaterial.diffuse.rgb + gl_FrontMaterial.emission.rgb, bgf, 1. - alpha) + sc.rgb * color.a;
color.a = 1;
}
if (acc_fog)
color.rgb = mix(color.rgb, gl_Fog.color.rgb, fogCoord);
color.r = 250;
gl_FragColor = color;
//gl_FragColor.rgb = mix(ldir, texture2D(t2, sp).rgb, 1. - alpha);
}