Created
January 15, 2016 20:24
-
-
Save kchapelier/a4a92ad4611129068e41 to your computer and use it in GitHub Desktop.
Working base for a full feature GPU-based CA runner in javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# original : https://www.shadertoy.com/view/Xd33WS | |
int getNeighbourhoodMoore1 (vec2 relativePos) { | |
int u = 0; | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 1.0))/iResolution.xy).x); | |
return u; | |
} | |
int getNeighbourhoodVonNeumann1 (vec2 relativePos) { | |
int u = 0; | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x); | |
return u; | |
} | |
int getNeighbourhoodVonNeumann2 (vec2 relativePos) { | |
int u = 0; | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0,-1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 1.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-2.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2(-2.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 2.0, 0.0))/iResolution.xy).x); | |
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 2.0))/iResolution.xy).x); | |
return u; | |
} | |
bool isBirth(int v) { | |
return (v == 4); | |
} | |
bool isSurvival(int v) { | |
return (v == 2 || v== 3 || v == 5); | |
} | |
void mainImage( out vec4 fragColor, in vec2 fragCoord ) | |
{ | |
if((iFrame==0)||(length(iMouse.xy-fragCoord))<5.0) | |
{ | |
fragColor.x=(fract(dot(sin(fragCoord*vec2(157.1,113.7)), | |
vec2(353.17+iGlobalTime,383.093-iGlobalTime)))>0.33)?0.0:1.0; | |
} | |
else | |
{ | |
fragColor=texture2D(iChannel0, fragCoord/iResolution.xy); | |
int v = getNeighbourhoodVonNeumann2(fragCoord); | |
if(isBirth(v)) { | |
fragColor.x=1.0; | |
} else if(fragColor.x > 0.5 && isSurvival(v)) { | |
fragColor.x=1.0; | |
} else { | |
fragColor.x=0.0; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment