Pixel-Composer/shaders/sh_rd_propagate/sh_rd_propagate.fsh
2024-01-10 12:36:33 +07:00

83 lines
2.2 KiB
GLSL

//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform vec2 k;
uniform int kUseSurf;
uniform sampler2D kSurf;
uniform vec2 f;
uniform int fUseSurf;
uniform sampler2D fSurf;
uniform vec2 dt;
uniform int dtUseSurf;
uniform sampler2D dtSurf;
uniform float dd;
uniform vec2 da;
uniform int daUseSurf;
uniform sampler2D daSurf;
uniform vec2 db;
uniform int dbUseSurf;
uniform sampler2D dbSurf;
float random (in vec2 st, float seed) { return fract(sin(dot(st.xy + vec2(21.456, 46.856), vec2(12.989, 78.233))) * (43758.545 + seed)); }
vec2 samp(float sx, float sy) { return texture2D( gm_BaseTexture, v_vTexcoord + vec2(sx, sy) / dimension ).xy; }
void main() {
#region
float _k = k.x;
if(kUseSurf == 1) {
vec4 _vMap = texture2D( kSurf, v_vTexcoord );
_k = mix(k.x, k.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float _f = f.x;
if(fUseSurf == 1) {
vec4 _vMap = texture2D( fSurf, v_vTexcoord );
_f = mix(f.x, f.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float _dt = dt.x;
if(dtUseSurf == 1) {
vec4 _vMap = texture2D( dtSurf, v_vTexcoord );
_dt = mix(dt.x, dt.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float _da = da.x;
if(daUseSurf == 1) {
vec4 _vMap = texture2D( daSurf, v_vTexcoord );
_da = mix(da.x, da.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float _db = db.x;
if(dbUseSurf == 1) {
vec4 _vMap = texture2D( dbSurf, v_vTexcoord );
_db = mix(db.x, db.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
#endregion
vec2 _0 = samp(-1., -1.), _1 = samp(0., -1.), _2 = samp(1., -1.);
vec2 _3 = samp(-1., 0.), _4 = samp(0., 0.), _5 = samp(1., 0.);
vec2 _6 = samp(-1., 1.), _7 = samp(0., 1.), _8 = samp(1., 1.);
vec2 lap = _0 * 0.05 + _1 * 0.2 + _2 * 0.05 +
_3 * 0.2 + _4 * -1. + _5 * 0.2 +
_6 * 0.05 + _7 * 0.2 + _8 * 0.05;
vec2 reaction = vec2(-1., 1.) * _4.x * _4.y * _4.y;
vec2 disipation = vec2(_f * (1. - _4.x), -(_k + _f) * _4.y);
vec2 diffusion = lap * vec2(_da, _db) * dd;
vec2 _new = _4 + (reaction + disipation + diffusion) * _dt;
gl_FragColor = vec4(_new, 0., 1.);
}