{
  "id": 3282,
  "name": "Fork of Cosmic Shader",
  "fragment": "#define TAU 6.28318530718\n#define MAX_ITER 5\n#define tau 6.2831853\n\nprecision highp float;\nprecision highp int;\nuniform vec2 Tiling_Caustic1477531952046_152_resolution;\nuniform vec3 backgroundColor;\nuniform vec3 Tiling_Caustic1477531952046_152_color;\nuniform float Tiling_Caustic1477531952046_152_speed;\nuniform float Tiling_Caustic1477531952046_152_brightness;\nuniform float time;\nuniform float contrast;\nuniform float distortion;\nuniform float Noise_Ripples1477531959288_166_speed;\nuniform vec3 Noise_Ripples1477531959288_166_color;\nuniform float Noise_Ripples1477531959288_166_brightness;\nuniform sampler2D noiseImage;\nuniform vec2 Noise_Ripples1477531959288_166_resolution;\nvarying vec2 Tiling_Caustic1477531952046_152_vUv;\nvarying vec2 Noise_Ripples1477531959288_166_vUv;\nmat2 makem2(in float theta) \n    {\n        float c = cos(theta);\n        float s = sin(theta);\n        return mat2(c, -s, s, c);\n    }\nfloat noise(in vec2 x) \n    {\n        return texture2D(noiseImage, x * .01).x;\n    }\nfloat fbm(in vec2 p) \n    {\n        float z = 2.;\n        float rz = 0.;\n        vec2 bp = p;\n        for (float i = 1.;\n i < 6.0; i++) \n        {\n            rz += abs((noise(p) - 0.5) * 2.0) / z;\n            z = z * 2.;\n            p = p * 2.;\n        }\n        return rz;\n    }\nfloat dualfbm(in vec2 p) \n    {\n        vec2 p2 = p * distortion;\n        vec2 basis = vec2(fbm(p2 - time * Noise_Ripples1477531959288_166_speed * 1.6), fbm(p2 + time * Noise_Ripples1477531959288_166_speed * 1.7));\n        basis = (basis - .5) * .2;\n        p += basis;\n        return fbm(p * makem2(time * Noise_Ripples1477531959288_166_speed * 0.2));\n    }\nvec4 Tiling_Caustic1477531952046_152_main() \n    {\n        vec4 Tiling_Caustic1477531952046_152_gl_FragColor = vec4(0.0);\n        vec2 uv = Tiling_Caustic1477531952046_152_vUv * Tiling_Caustic1477531952046_152_resolution;\n        vec2 p = mod(uv * TAU, TAU) - 250.0;\n        vec2 i = vec2(p);\n        float c = 1.0;\n        float inten = 0.005;\n        for (int n = 0;\n n < MAX_ITER; n++) \n        {\n            float t = time * Tiling_Caustic1477531952046_152_speed * (1.0 - (3.5 / float(n + 1)));\n            i = p + vec2(cos(t - i.x) + sin(t + i.y), sin(t - i.y) + cos(t + i.x));\n            c += 1.0 / length(vec2(p.x / (sin(i.x + t) / inten), p.y / (cos(i.y + t) / inten)));\n        }\n        c /= float(MAX_ITER);\n        c = 1.17 - pow(c, Tiling_Caustic1477531952046_152_brightness);\n        vec3 rgb = vec3(pow(abs(c), 8.0));\n        Tiling_Caustic1477531952046_152_gl_FragColor = vec4(rgb * Tiling_Caustic1477531952046_152_color + backgroundColor, 1.0);\n        return Tiling_Caustic1477531952046_152_gl_FragColor *= 1.0;\n    }\nvec4 Noise_Ripples1477531959288_166_main() \n    {\n        vec4 Noise_Ripples1477531959288_166_gl_FragColor = vec4(0.0);\n        vec2 p = (Noise_Ripples1477531959288_166_vUv.xy - 0.5) * Noise_Ripples1477531959288_166_resolution;\n        float rz = dualfbm(p);\n        vec3 col = (Noise_Ripples1477531959288_166_color / rz) * Noise_Ripples1477531959288_166_brightness;\n        col = ((col - 0.5) * max(contrast, 0.0)) + 0.5;\n        Noise_Ripples1477531959288_166_gl_FragColor = vec4(col, 1.0);\n        return Noise_Ripples1477531959288_166_gl_FragColor *= 1.0;\n    }\nvoid main() \n    {\n        gl_FragColor = (Noise_Ripples1477531959288_166_main() + Tiling_Caustic1477531952046_152_main());    }\n",
  "vertex": "precision highp float;\nprecision highp int;\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform float time;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\nvarying vec3 Tiling_Caustic1477531952046_152_vPosition;\nvarying vec3 Tiling_Caustic1477531952046_152_vNormal;\nvarying vec2 Tiling_Caustic1477531952046_152_vUv;\nvarying vec2 Tiling_Caustic1477531952046_152_vUv2;\nvarying vec3 Noise_Ripples1477531959288_166_vPosition;\nvarying vec3 Noise_Ripples1477531959288_166_vNormal;\nvarying vec2 Noise_Ripples1477531959288_166_vUv;\nvarying vec2 Noise_Ripples1477531959288_166_vUv2;\nvec4 Tiling_Caustic1477531952046_152_main() \n    {\n        vec4 Tiling_Caustic1477531952046_152_gl_Position = vec4(0.0);\n        Tiling_Caustic1477531952046_152_vNormal = normal;\n        Tiling_Caustic1477531952046_152_vUv = uv;\n        Tiling_Caustic1477531952046_152_vUv2 = uv2;\n        Tiling_Caustic1477531952046_152_vPosition = position;\n        Tiling_Caustic1477531952046_152_gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n        return Tiling_Caustic1477531952046_152_gl_Position *= 1.0;\n    }\nvec4 Noise_Ripples1477531959288_166_main() \n    {\n        vec4 Noise_Ripples1477531959288_166_gl_Position = vec4(0.0);\n        Noise_Ripples1477531959288_166_vNormal = normal;\n        Noise_Ripples1477531959288_166_vUv = uv;\n        Noise_Ripples1477531959288_166_vUv2 = uv2;\n        Noise_Ripples1477531959288_166_vPosition = position;\n        Noise_Ripples1477531959288_166_gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n        return Noise_Ripples1477531959288_166_gl_Position *= 1.0;\n    }\nvoid main() \n    {\n        gl_Position = Tiling_Caustic1477531952046_152_main() + Noise_Ripples1477531959288_166_main();    }\n",
  "uniforms": {
    "cameraPosition": {
      "type": "v3",
      "glslType": "vec3"
    },
    "time": {
      "type": "f",
      "glslType": "float"
    },
    "backgroundColor": {
      "value": {
        "r": 0.08235294117647059,
        "g": 0.06274509803921569,
        "b": 0.19607843137254902
      },
      "type": "c",
      "glslType": "vec3"
    },
    "Tiling_Caustic1477531952046_152_resolution": {
      "value": {
        "x": 1,
        "y": 1
      },
      "type": "v2",
      "glslType": "vec2"
    },
    "Tiling_Caustic1477531952046_152_color": {
      "value": {
        "r": 0.4666666666666667,
        "g": 0.9294117647058824,
        "b": 0.9529411764705882
      },
      "type": "c",
      "glslType": "vec3"
    },
    "Tiling_Caustic1477531952046_152_speed": {
      "value": "0.5",
      "type": "f",
      "glslType": "float"
    },
    "Tiling_Caustic1477531952046_152_brightness": {
      "value": "1.5",
      "type": "f",
      "glslType": "float"
    },
    "noiseImage": {
      "value": null,
      "type": "t",
      "glslType": "sampler2D"
    },
    "distortion": {
      "value": "1",
      "type": "f",
      "glslType": "float"
    },
    "contrast": {
      "value": "1.4",
      "type": "f",
      "glslType": "float"
    },
    "Noise_Ripples1477531959288_166_speed": {
      "value": "0.1",
      "type": "f",
      "glslType": "float"
    },
    "Noise_Ripples1477531959288_166_color": {
      "value": {
        "r": 0.6823529411764706,
        "g": 0.7725490196078432,
        "b": 0.6666666666666666
      },
      "type": "c",
      "glslType": "vec3"
    },
    "Noise_Ripples1477531959288_166_brightness": {
      "value": "0.1",
      "type": "f",
      "glslType": "float"
    },
    "Noise_Ripples1477531959288_166_resolution": {
      "value": {
        "x": "2",
        "y": "2"
      },
      "type": "v2",
      "glslType": "vec2"
    }
  }
}