Shader "CrispyPin/gol" { Properties { _LastFrame ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _LastFrame; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } int state(half2 uv, half x, half y){ return tex2D(_LastFrame, uv + half2(x, y)).r > 0; } fixed4 frag (v2f i) : SV_Target { const half d = 1.0/256.0; int count = state(i.uv, -d, -d)+ state(i.uv, 0, -d)+ state(i.uv, d, -d)+ state(i.uv, -d, 0)+ state(i.uv, d, 0)+ state(i.uv, -d, d)+ state(i.uv, 0, d)+ state(i.uv, d, d); half this = tex2D(_LastFrame, i.uv).r; half state; if (this.r > 0){ state = count > 1 && count < 4; // col = count > 0 && count < 6; // mazetric } else { state = count == 3; } float4 col = float4(i.uv * state, 0.5 * state, 1); return col; } ENDCG } } }