<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Michael Muratov</title><link>https://michaelmuratov.ca/categories/graphics/</link><description>Recent content on Michael Muratov</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 01 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://michaelmuratov.ca/categories/graphics/index.xml" rel="self" type="application/rss+xml"/><item><title>Shaders in GLSL Canvas</title><link>https://michaelmuratov.ca/blog/artifacts/guides/shaders-glsl-canvas/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><guid>https://michaelmuratov.ca/blog/artifacts/guides/shaders-glsl-canvas/</guid><description>&lt;script src="https://cdn.jsdelivr.net/npm/glslCanvas@0.2.6/dist/GlslCanvas.min.js"&gt;&lt;/script&gt;
&lt;h3 id="glsl-library"&gt;GLSL Library&lt;/h3&gt;
&lt;p&gt;GLSL Canvas is a library that allows you to run GLSL shaders in a web environment. It makes it easy to create interactive graphics and visualizations using shader language inside a canvas element with WebGL.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/patriciogonzalezvivo/glslCanvas"&gt;https://github.com/patriciogonzalezvivo/glslCanvas&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://cdn.jsdelivr.net/npm/glslCanvas@0.2.6/dist/GlslCanvas.min.js&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="shadertoy---glsl-canvas"&gt;ShaderToy -&amp;gt; GLSL Canvas&lt;/h3&gt;
&lt;p&gt;The original shader we&amp;rsquo;ll be using was written for ShaderToy, which uses a specific set of uniforms and functions. In GLSL Canvas, we need to adapt the code to use the &lt;code&gt;u_time&lt;/code&gt; and &lt;code&gt;u_resolution&lt;/code&gt; uniforms provided by the library. The main function will also be adjusted to fit the GLSL Canvas structure.&lt;/p&gt;</description><content:encoded><![CDATA[<script src="https://cdn.jsdelivr.net/npm/glslCanvas@0.2.6/dist/GlslCanvas.min.js"></script>

<h3 id="glsl-library">GLSL Library</h3>
<p>GLSL Canvas is a library that allows you to run GLSL shaders in a web environment. It makes it easy to create interactive graphics and visualizations using shader language inside a canvas element with WebGL.</p>
<p><a href="https://github.com/patriciogonzalezvivo/glslCanvas">https://github.com/patriciogonzalezvivo/glslCanvas</a></p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="s2">&#34;https://cdn.jsdelivr.net/npm/glslCanvas@0.2.6/dist/GlslCanvas.min.js&#34;</span><span class="o">&gt;&lt;</span><span class="err">/script&gt;</span></span></span></code></pre></div>
<h3 id="shadertoy---glsl-canvas">ShaderToy -&gt; GLSL Canvas</h3>
<p>The original shader we&rsquo;ll be using was written for ShaderToy, which uses a specific set of uniforms and functions. In GLSL Canvas, we need to adapt the code to use the <code>u_time</code> and <code>u_resolution</code> uniforms provided by the library. The main function will also be adjusted to fit the GLSL Canvas structure.</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-glsl" data-lang="glsl"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#define iTime u_time</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#define iResolution vec3(u_resolution, 1.0)</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">uniform</span> <span class="k">float</span> <span class="n">u_time</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="k">uniform</span> <span class="k">vec2</span> <span class="n">u_resolution</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">//Shadertoy fragment shader main function</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="k">void</span> <span class="n">mainImage</span><span class="p">(</span> <span class="k">out</span> <span class="k">vec4</span> <span class="n">fragColor</span><span class="p">,</span> <span class="k">in</span> <span class="k">vec2</span> <span class="n">fragCoord</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">//GLSL Canvas main function</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="k">void</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">vec4</span> <span class="n">color</span> <span class="o">=</span> <span class="k">vec4</span><span class="p">(</span><span class="mf">0.0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="n">mainImage</span><span class="p">(</span><span class="n">color</span><span class="p">,</span> <span class="n">gl_FragCoord</span><span class="p">.</span><span class="n">xy</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="n">gl_FragColor</span> <span class="o">=</span> <span class="n">color</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="p">}</span></span></span></code></pre></div>
<h3 id="html-setup">HTML Setup</h3>
<p>To use GLSL Canvas, you need to include the library in your HTML file and create a canvas element where the shader will be rendered. Here&rsquo;s a simple setup:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://cdn.jsdelivr.net/npm/glslCanvas@0.2.6/dist/GlslCanvas.min.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="p">&lt;</span><span class="nt">textarea</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;shaderEditor&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    {{ GLSL shader code here }}
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="p">&lt;/</span><span class="nt">textarea</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">&lt;</span><span class="nt">canvas</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;shaderCanvas&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;shader-canvas&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">canvas</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="kr">const</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;shaderCanvas&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="kr">const</span> <span class="nx">sandbox</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">GlslCanvas</span><span class="p">(</span><span class="nx">canvas</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="kr">const</span> <span class="nx">editor</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;shaderEditor&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="kd">function</span> <span class="nx">resizeCanvasToCSSSize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="kr">const</span> <span class="nx">displayWidth</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">clientWidth</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="kr">const</span> <span class="nx">displayHeight</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">clientHeight</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">// Only update if size changed
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">!==</span> <span class="nx">displayWidth</span> <span class="o">||</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">!==</span> <span class="nx">displayHeight</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">      <span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nx">displayWidth</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">      <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="nx">displayHeight</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="c1">// Resize initially and on window resize
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="nx">resizeCanvasToCSSSize</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="nx">sandbox</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">editor</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="nx">editor</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&#34;input&#34;</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="nx">sandbox</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">editor</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
<h3 id="shader-spiral">Shader: Spiral</h3>
<p>You can edit the values in the textarea below to see how they affect the shader in real-time. The shader creates a colorful spiral effect that changes over time.</p>
<p>I recomend focusing on the <code>width</code>, <code>dis</code>, <code>blur</code>, <code>rep</code>, <code>mul</code>, and <code>ex</code> variables to see how they affect the spiral&rsquo;s appearance.</p>
<p>The <code>points</code> variable controls the number of points in the spiral.</p>
<textarea id="shaderEditor" class="shader-code-editor" width="100%" rows="10" cols="60" color="white" style="width: 100%; height: 500px; font-family: monospace; font-size: 0.82rem; background-color: #222; color: #fff; border: none; padding: 10px; resize: vertical;">
    
#ifdef GL_ES
precision mediump float;
#endif

#define iTime u_time
#define iResolution vec3(u_resolution, 1.0)
#define pallet(d) mix(vec3(0.2,0.7,0.9),vec3(1.,0.,1.),d)

uniform float u_time;
uniform vec2 u_resolution;

float width = 0.1;
float dis = 0.5;
float blur = 0.7;
float rep = 1.0;
float mul = 0.15;
float ex = 1.0;
float points = 5.0;

#define PI 3.14159
#define e  2.71828

// Radial UV from https://www.shadertoy.com/view/XdXXzf
vec2 radialUV(in vec2 uv)
{
    vec2 rUV = vec2(0.0);
    rUV.x = atan(uv.x, uv.y) * 0.159 &#43; 0.5;
    rUV.y = length(uv) * 0.6;
    
    return rUV * 2.0;
}

vec2 rotUV(in vec2 uv, in float angle) {
    float ru = uv.x*cos(angle) - uv.y*sin(angle);
    float rv = uv.x*sin(angle) &#43; uv.y*cos(angle);
    return vec2(ru, rv);
}

float timeCycle(float a, float m) {
    return sin((iTime &#43; a)*m);
}

float timeCycle01(float a, float m, float s) {
    return max((sin((iTime &#43; a)*m) &#43; 1.0)*0.5, s);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv  = (fragCoord-0.5*iResolution.xy)/iResolution.y;
    uv = rotUV(uv, -0.5*iTime);
    vec2 ruv = radialUV(uv);
    
    mul &#43;= timeCycle(0.0, 0.5) * 0.1;
    rep &#43;= timeCycle(1.5, 0.3) * 0.03;
    ex &#43;= timeCycle(0.3, 0.2) * 0.4; 
    width -= timeCycle01(0.5, 0.33, 0.0) * 0.05;

    float l = length(uv);
    float distIncrease = pow(distance(ruv.y, 0.0), ex) * mul;
    l &#43;= sin(ruv.x*(PI&#43;0.003)*points) * distIncrease;
   
    
    // Spiral based on https://www.shadertoy.com/view/WtjSWt
    float angle = atan(uv.y, uv.x);
    float offset = (log(l) / log(e*PI*rep) &#43; (angle / (2.0*PI)) * dis);
    float spiral = mod(offset - 0.5*iTime, dis);
    
    width *= pow(1.33-distance(ruv.y, 0.0), 4.0);
    float spiralR = smoothstep(spiral - blur*0.3, spiral, width) &#43; 
                    smoothstep(1.0-spiral - blur, 1.0-spiral, width);
             
    float spiralG = smoothstep(spiral - blur*timeCycle01(0.0, 0.33, 0.5), spiral, width) &#43; 
                    smoothstep(1.0-spiral - blur*timeCycle01(PI, 0.2, 0.5), 1.0-spiral, width);
             
    float spiralB = smoothstep(spiral - blur, spiral, width) &#43; 
                    smoothstep(1.0-spiral - blur*0.3, 1.0-spiral, width);
    
    vec3 col = vec3(spiralR, spiralG, spiralB);
    fragColor = vec4(col, 1.0);
}

void main() {
    vec4 color = vec4(0.0);
    mainImage(color, gl_FragCoord.xy);
    gl_FragColor = color;
}

</textarea>

<style>
    .grid-container {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      gap: 0.9rem;
      padding: 0.9rem;
      border: 1px solid var(--border);
      border-radius: var(--standard-border-radius);
      background: var(--accent-bg);
      margin: 0.8rem 0;
    }

    .slider-block {
      display: flex;
      flex-direction: column;
      align-items: start;
      gap: 0.35rem;
      padding: 0.5rem 0.6rem;
      border: 1px dashed color-mix(in srgb, var(--border) 75%, transparent);
      border-radius: var(--standard-border-radius);
      background: color-mix(in srgb, var(--accent-bg) 92%, var(--bg));
    }

    .slider-block input[type="range"] {
      width: 100%;
      appearance: none;
      -webkit-appearance: none;
      background: transparent;
      margin: 0.1rem 0 0;
    }

    .label-row {
      display: flex;
      justify-content: space-between;
      width: 100%;
      align-items: baseline;
      gap: 0.5rem;
    }

    .label-row h4 {
      margin: 0;
      font-size: 0.95rem;
      font-weight: 600;
      color: var(--text);
    }

    .slider-block span {
      font-size: 0.86rem;
      color: var(--text-light);
    }

    .slider-block input[type="range"]::-webkit-slider-runnable-track {
      height: 0.4rem;
      border-radius: 999px;
      background: color-mix(in srgb, var(--accent) 28%, var(--accent-bg));
      border: 1px solid color-mix(in srgb, var(--border) 85%, transparent);
    }

    .slider-block input[type="range"]::-webkit-slider-thumb {
      -webkit-appearance: none;
      width: 0.95rem;
      height: 0.95rem;
      margin-top: -0.33rem;
      border-radius: 50%;
      background: var(--accent);
      border: 1px solid var(--accent-hover);
      box-shadow: 0 0 0 2px var(--accent-bg);
      cursor: pointer;
    }

    .slider-block input[type="range"]::-moz-range-track {
      height: 0.4rem;
      border-radius: 999px;
      background: color-mix(in srgb, var(--accent) 28%, var(--accent-bg));
      border: 1px solid color-mix(in srgb, var(--border) 85%, transparent);
    }

    .slider-block input[type="range"]::-moz-range-thumb {
      width: 0.95rem;
      height: 0.95rem;
      border-radius: 50%;
      background: var(--accent);
      border: 1px solid var(--accent-hover);
      box-shadow: 0 0 0 2px var(--accent-bg);
      cursor: pointer;
    }

    .slider-block input[type="range"]:focus-visible {
      outline: none;
    }

    .slider-block input[type="range"]:focus-visible::-webkit-slider-thumb {
      box-shadow: 0 0 0 2px var(--accent-bg), 0 0 0 4px color-mix(in srgb, var(--accent) 35%, transparent);
    }

    .slider-block input[type="range"]:focus-visible::-moz-range-thumb {
      box-shadow: 0 0 0 2px var(--accent-bg), 0 0 0 4px color-mix(in srgb, var(--accent) 35%, transparent);
    }

    @media (max-width: 720px) {
      .grid-container {
        grid-template-columns: 1fr;
      }
    }
  </style>




<div class="grid-container">
  
  <div class="slider-block">
    <div class="label-row">
        <h4>Width</h4>
    </div>
    <input type="range" min="0.1" max="0.9" step="0.1" value="0.1" id="widthSlider" style="width:50%;">
    <span id="widthValue">0.1</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Distance</h4>
    </div>
    <input type="range" min="0.1" max="0.9" step="0.1" value="0.5" id="distanceSlider" style="width:50%;">
    <span id="distanceValue">0.5</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Blur</h4>
    </div>
    <input type="range" min="0.1" max="0.9" step="0.1" value="0.7" id="blurSlider" style="width:50%;">
    <span id="blurValue">0.7</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Repetition</h4>
    </div>
    <input type="range" min="0.1" max="0.9" step="0.1" value="1.0" id="repetitionSlider" style="width:50%;">
    <span id="repetitionValue">1.0</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Multiply</h4>
    </div>
    <input type="range" min="0.1" max="0.9" step="0.1" value="0.15" id="multiplySlider" style="width:50%;">
    <span id="multiplyValue">0.15</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Exponent</h4>
    </div>
    <input type="range" min="1" max="10" step="1" value="1" id="exponentSlider" style="width:50%;">
    <span id="exponentValue">1</span>
  </div>
  <div class="slider-block">
    <div class="label-row">
        <h4>Points</h4>
    </div>
    <input type="range" min="0" max="10" step="1" value="5" id="pointsSlider" style="width:50%;">
    <span id="pointsValue">5</span>
  </div>
</div>



<canvas id="shaderCanvas" class="shader-canvas"></canvas>
<noscript>
  <p>This interactive shader demo requires JavaScript. The GLSL source code is shown above.</p>
</noscript>

<script>
const canvas = document.getElementById("shaderCanvas");
const editor = document.getElementById("shaderEditor");

const widthSlider = document.getElementById("widthSlider");
const distanceSlider = document.getElementById("distanceSlider");
const blurSlider = document.getElementById("blurSlider");
const repetitionSlider = document.getElementById("repetitionSlider");
const multiplySlider = document.getElementById("multiplySlider");
const exponentSlider = document.getElementById("exponentSlider");
const pointsSlider = document.getElementById("pointsSlider");

const widthValue = document.getElementById("widthValue");
const distanceValue = document.getElementById("distanceValue");
const blurValue = document.getElementById("blurValue");
const repetitionValue = document.getElementById("repetitionValue");
const multiplyValue = document.getElementById("multiplyValue");
const exponentValue = document.getElementById("exponentValue");
const pointsValue = document.getElementById("pointsValue");

if (!window.GlslCanvas) {
  console.error("GlslCanvas failed to load. Check CDN/network access.");
  canvas.outerHTML = '<p>Interactive shader preview is unavailable right now. The GLSL source code is still available above.</p>';
} else {
  const sandbox = new GlslCanvas(canvas);

function resizeCanvasToCSSSize() {
    const displayWidth = canvas.clientWidth;
    const displayHeight = canvas.clientHeight;

    
    if (canvas.width !== displayWidth || canvas.height !== displayHeight) {
      canvas.width = displayWidth;
      canvas.height = displayHeight;
    }
  }


resizeCanvasToCSSSize();
sandbox.load(editor.value);
editor.addEventListener("input", () => {
    sandbox.load(editor.value);
});

widthSlider.oninput = function () {
  widthValue.textContent = this.value;
  editor.value = editor.value.replace(/float width = [0-9]*\.[0-9]*/g, `float width = ${this.value}`);
  sandbox.load(editor.value);
}

distanceSlider.oninput = function () {
  distanceValue.textContent = this.value;
  editor.value = editor.value.replace(/float dis = [0-9]*\.[0-9]*/g, `float dis = ${this.value}`);
  sandbox.load(editor.value);
}

blurSlider.oninput = function () {
  blurValue.textContent = this.value;
  editor.value = editor.value.replace(/float blur = [0-9]*\.[0-9]*/g, `float blur = ${this.value}`);
  sandbox.load(editor.value);
}

repetitionSlider.oninput = function () {
  repetitionValue.textContent = this.value;
  editor.value = editor.value.replace(/float rep = [0-9]*\.[0-9]*/g, `float rep = ${this.value}`);
  sandbox.load(editor.value);
}

multiplySlider.oninput = function () {
  multiplyValue.textContent = this.value;
  editor.value = editor.value.replace(/float mul = [0-9]*\.[0-9]*/g, `float mul = ${this.value}`);
  sandbox.load(editor.value);
}

exponentSlider.oninput = function () {
  exponentValue.textContent = this.value;
  editor.value = editor.value.replace(/float ex = [0-9]*/g, `float ex = ${this.value}`);
  sandbox.load(editor.value);
}

pointsSlider.oninput = function () {
  pointsValue.textContent = this.value;
  editor.value = editor.value.replace(/float points = [0-9]*/g, `float points = ${this.value}`);
  sandbox.load(editor.value);
}
}

</script>

<h3 id="original-shader">Original Shader</h3>
<p><a href="https://www.shadertoy.com/view/Wct3zX">https://www.shadertoy.com/view/Wct3zX</a></p>
]]></content:encoded></item></channel></rss>