mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-12-27 07:26:33 +01:00
175 lines
3.9 KiB
GLSL
175 lines
3.9 KiB
GLSL
//
|
|
// Simple passthrough fragment shader
|
|
//
|
|
varying vec2 v_vTexcoord;
|
|
varying vec4 v_vColour;
|
|
|
|
uniform vec2 dimension;
|
|
uniform vec2 lightPos;
|
|
|
|
uniform int useSolid;
|
|
uniform sampler2D solid;
|
|
|
|
uniform float pointLightRadius;
|
|
uniform float lightRadius;
|
|
uniform float lightDensity;
|
|
uniform int lightType;
|
|
uniform int renderSolid;
|
|
|
|
uniform int bgUse;
|
|
uniform float bgThres;
|
|
uniform float lightBand;
|
|
uniform float lightAttn;
|
|
|
|
uniform float ao;
|
|
uniform float aoStr;
|
|
uniform int mask;
|
|
|
|
uniform vec4 lightAmb;
|
|
uniform vec4 lightClr;
|
|
uniform float lightInt;
|
|
|
|
#define TAU 6.283185307179586
|
|
|
|
void main() {
|
|
vec4 bg = texture2D( gm_BaseTexture, v_vTexcoord );
|
|
vec4 sl = texture2D( solid, v_vTexcoord );
|
|
|
|
if(useSolid == 1 && sl.a == 1.) {
|
|
if(mask == 0)
|
|
gl_FragColor = renderSolid == 1? sl : bg * lightAmb;
|
|
else if(mask == 1)
|
|
gl_FragColor = vec4(vec3(0.), bg.a);
|
|
return;
|
|
}
|
|
|
|
float bright = 1.;
|
|
vec2 tx = 1. / dimension;
|
|
vec2 aspect = vec2(dimension) / dimension.x;
|
|
|
|
vec2 pxPos = v_vTexcoord * dimension;
|
|
vec2 ang, lang;
|
|
vec2 lightPosTx = lightPos * tx;
|
|
float dst;
|
|
|
|
if(lightType == 0) {
|
|
ang = normalize(lightPos - pxPos) * tx;
|
|
lang = vec2(ang.y, -ang.x) * lightRadius * dimension;
|
|
dst = length(lightPos - pxPos);
|
|
} else if(lightType == 1) {
|
|
ang = normalize(lightPosTx - vec2(.5)) * tx;
|
|
lang = vec2(ang.y, -ang.x) * lightRadius;
|
|
dst = length(dimension);
|
|
}
|
|
|
|
float softlight = lightDensity - 1.;
|
|
float lightAmo = softlight * 2. + 1.;
|
|
int iLightAmo = int(lightAmo);
|
|
int lightCatch[33];
|
|
|
|
for(int i = 0; i < iLightAmo; i++)
|
|
lightCatch[i] = 1;
|
|
|
|
for(float i = 1.; i < dst; i++) {
|
|
for(int j = 0; j <= iLightAmo; j++) {
|
|
if(lightCatch[j] == 0) continue;
|
|
|
|
vec2 _lightPos, _ang;
|
|
|
|
if(lightType == 0) {
|
|
_lightPos = lightPos + lang * (float(j) - softlight);
|
|
_ang = normalize(_lightPos - pxPos) * tx;
|
|
} else if(lightType == 1) {
|
|
_lightPos = vec2(.5) + ang * dimension + lang * (float(j) - softlight);
|
|
_ang = normalize(_lightPos - vec2(.5)) * tx;
|
|
}
|
|
|
|
vec2 _pos = v_vTexcoord + _ang * i;
|
|
vec2 _posPx = _pos * dimension;
|
|
|
|
if(lightType == 0 && floor(abs(lightPos.x - _posPx.x)) + floor(abs(lightPos.y - _posPx.y)) < 1.)
|
|
continue;
|
|
|
|
if(_pos.x < 0. || _pos.y < 0. || _pos.x > 1. || _pos.y > 1.)
|
|
continue;
|
|
|
|
if(useSolid == 1) {
|
|
vec4 _sl = texture2D( solid, _pos );
|
|
if(_sl.a == 1.)
|
|
lightCatch[j] = 0;
|
|
}
|
|
|
|
if(bgUse == 1) {
|
|
vec4 hg = texture2D( gm_BaseTexture, _pos );
|
|
if(distance(bg, hg) >= bgThres)
|
|
lightCatch[j] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(ao > 0.) {
|
|
float ambient = 0.;
|
|
|
|
for(float i = 0.; i < ao; i++) {
|
|
float base = 1.;
|
|
float top = 0.;
|
|
for(float j = 0.; j <= 64.; j++) {
|
|
float ang = top / base * TAU;
|
|
top += 2.;
|
|
if(top >= base) {
|
|
top = 1.;
|
|
base *= 2.;
|
|
}
|
|
|
|
vec2 _pos = v_vTexcoord + vec2(cos(ang), sin(ang)) * i * tx;
|
|
|
|
if(_pos.x < 0. || _pos.y < 0. || _pos.x > 1. || _pos.y > 1.)
|
|
continue;
|
|
|
|
if(useSolid == 1) {
|
|
vec4 _sl = texture2D( solid, _pos );
|
|
if(_sl.a == 1.)
|
|
ambient++;
|
|
}
|
|
|
|
if(bgUse == 1) {
|
|
vec4 hg = texture2D( gm_BaseTexture, _pos );
|
|
if(distance(bg, hg) >= bgThres)
|
|
ambient++;
|
|
}
|
|
}
|
|
}
|
|
|
|
lightAmo += ambient * aoStr * aoStr;
|
|
}
|
|
|
|
int lightCatched = 0;
|
|
for(int i = 0; i < iLightAmo; i++) {
|
|
if(lightCatch[i] == 1)
|
|
lightCatched++;
|
|
}
|
|
|
|
float shadow = float(lightCatched) / lightAmo;
|
|
|
|
if(lightType == 0) {
|
|
float dist = distance(v_vTexcoord * dimension, lightPos);
|
|
float prg = 1. - clamp(dist / pointLightRadius, 0., 1.);
|
|
|
|
shadow *= prg * prg;
|
|
}
|
|
|
|
if(lightAttn == 0.)
|
|
shadow = shadow * shadow;
|
|
else if(lightAttn == 1.)
|
|
shadow = 1. - (shadow - 1.) * (shadow - 1.);
|
|
else if(lightAttn == 2.)
|
|
shadow = shadow;
|
|
|
|
if(lightBand > 0.)
|
|
shadow = ceil(shadow * lightBand) / lightBand;
|
|
|
|
if(mask == 0)
|
|
gl_FragColor = vec4(bg.rgb * mix(lightClr * lightAmb, lightClr, shadow * lightInt).rgb, bg.a);
|
|
else if(mask == 1)
|
|
gl_FragColor = vec4(vec3(shadow * lightInt), bg.a);
|
|
}
|