glslCanvas
glslCanvas copied to clipboard
use backbuffer to render reaction-diffusion not working, any problem with my code?
Hi this is my code for animating the reaction-diffusion simulation, I want to use mouse click to add species B to the screen, I run it in glslEditor, it reports no error but only shows a black background.
Hope you help me check what's wrong with my code
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform sampler2D u_buffer0;
const vec4 params = vec4(0.16, 0.08, 0.06, 0.062);
const vec4 color1 = vec4(0.0, 0.0, 0.0, 0.3137);
const vec4 color2 = vec4(1.0, 0.1843, 0.5333, 0.3765);
const vec4 color3 = vec4(0.8549, 1.0, 0.5333, 0.3882);
const vec4 color4 = vec4(0.3765, 1.0, 0.4784, 0.3922);
const vec4 color5 = vec4(1.0);
void main()
{
vec2 uv_texcoord = gl_FragCoord.xy / u_resolution.xy;
#if defined( BUFFER0 )
if(u_mouse.x < -5.0)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
return;
}
vec2 pixelSize = 1.0 / u_resolution.xy;
vec2 cen = texture2D(u_buffer0, uv_texcoord).xy;
vec2 rig = texture2D(u_buffer0, uv_texcoord + vec2( pixelSize.x, 0.0)).xy;
vec2 top = texture2D(u_buffer0, uv_texcoord + vec2( 0.0, pixelSize.y)).xy;
vec2 lef = texture2D(u_buffer0, uv_texcoord + vec2(-pixelSize.x, 0.0)).xy;
vec2 bot = texture2D(u_buffer0, uv_texcoord + vec2( 0.0, -pixelSize.y)).xy;
float Du = params.x;
float Dv = params.y;
float feed = params.z;
float kill = params.w;
vec2 lapl = rig + top + lef + bot - 4.0 * cen;
float du = Du * lapl.x - cen.x * cen.y * cen.y + feed * (1.0 - cen.x);
float dv = Dv * lapl.y + cen.x * cen.y * cen.y - (feed + kill) * cen.y;
vec2 newValue = cen + 0.6 * vec2(du, dv);
if(u_mouse.x > 0.0)
{
vec2 diff = (gl_FragCoord.xy - u_mouse.xy);
float dist = dot(diff, diff);
if(dist < 1.0)
newValue.y = 0.9;
}
gl_FragCoord = vec4(newValue, 0.0, 1.0);
#else
float value = texture2D(u_buffer0, uv_texcoord).y;
float a;
vec3 col;
if (value <= color1.w)
{
col = color1.xyz;
}
else if (value > color1.w && value <= color2.w)
{
a = (value - color1.w) / (color2.w - color1.w);
col = mix(color1.xyz, color2.xyz, a);
}
else if (value > color2.w && value <= color3.w)
{
a = (value - color2.w) / (color3.w - color2.w);
col = mix(color2.xyz, color3.xyz, a);
}
else if (value > color3.w && value <= color4.w)
{
a = (value - color3.w) / (color4.w - color3.w);
col = mix(color3.xyz, color4.xyz, a);
}
else if (value > color4.w && value <= color5.w)
{
a = (value - color4.w) / (color5.w - color4.w);
col = mix(color4.xyz, color5.xyz, a);
}
gl_FragColor = vec4(col.xyz, 1.0);
#endif
}