{"componentChunkName":"component---src-templates-case-study-js","path":"/case-studies/shader-expo","result":{"data":{"markdownRemark":{"id":"22384070-3ef5-5b29-8443-6fc146642d9d","html":"<p>WebGL Shader Playground.</p>\n<h2 id=\"Features\"><a href=\"#Features\" aria-label=\"Features permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Features</h2>\n<ul>\n<li>Rich CodeEditor</li>\n<li>Simple CodeEditor</li>\n<li>AutoCompletion</li>\n<li>Live Editing</li>\n<li>Basic Debugging</li>\n</ul>\n<p>I made shader expo because I wanted to learn WebGL Shaders quickly and to understand how WebGL handles shaders at the runtime.\nThe most critical part of Webgl is setting up the boilerplate for all the code.</p>\n<h2 id=\"Shader-Class\"><a href=\"#Shader-Class\" aria-label=\"Shader Class permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Shader Class</h2>\n<p>I created this modular shader class to handle, update, compile the Fragment, and Vertex shaders.\nIt holds the <code class=\"language-text\">WebGL Program</code>, fragmentShader and VertexShader source String and shaders itself, and <code class=\"language-text\">Errors</code> of each shader.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Shader</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">gl<span class=\"token punctuation\">,</span> vShader<span class=\"token punctuation\">,</span> fShader</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl <span class=\"token operator\">=</span> gl\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vShader <span class=\"token operator\">=</span> vShader\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fShader <span class=\"token operator\">=</span> fShader\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vertexShader <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fragmentShader <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>uniforms <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>attribs <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isVertexShaderError <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isFragmentShaderError <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fragmentShaderErrors <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vertexShaderErrors <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"Init-Shaders\"><a href=\"#Init-Shaders\" aria-label=\"Init Shaders permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Init Shaders</h3>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/blob/master/js/Shader.js#L23\">init code on github</a> </p>\n</blockquote>\n<p>Then I added a init method which initializes the shaders from its source and creates the program with <code class=\"language-text\">this.createProgram</code> method.\nIf we encounter any errors, then we will not create the program and terminate the function. We also have <code class=\"language-text\">this.createShader()</code> method, which creates and initialize the shader.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vertexShader <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createShader</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token constant\">VERTEX_SHADER</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vShader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fragmentShader <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createShader</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token constant\">FRAGMENT_SHADER</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fShader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isFragmentShaderError<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isVertexShaderError<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createProgram</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"createShader\"><a href=\"#createShader\" aria-label=\"createShader permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>createShader</h3>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/blob/master/js/Shader.js#L101\">createShader code on github</a> </p>\n</blockquote>\n<p>createShader method creates the WebGL shader from the source, compiles it, and checks for errors. and if we encounter any errors while compiling we set the <code class=\"language-text\">isVertexShaderError</code> and <code class=\"language-text\">isFragmentShaderError</code> to <code class=\"language-text\">true</code> and also sets the <code class=\"language-text\">vertexShaderErrors</code>, <code class=\"language-text\">fragmentShaderErrors</code> with the error message.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token function\">createShader</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">type<span class=\"token punctuation\">,</span> source</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> shader <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">createShader</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">shaderSource</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">,</span> source<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">compileShader</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// Check For Shader Errors</span>\n  <span class=\"token keyword\">let</span> error <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getShaderError</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">,</span> source<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> name <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>type <span class=\"token operator\">==</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token constant\">VERTEX_SHADER</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> <span class=\"token string\">'VERTEX_SHADER'</span> <span class=\"token punctuation\">:</span> <span class=\"token string\">'FRAGMENT_SHADER'</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    error<span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'VERTEX_SHADER'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vertexShaderErrors <span class=\"token operator\">=</span> error<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isVertexShaderError <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fragmentShaderErrors <span class=\"token operator\">=</span> error<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isFragmentShaderError <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> shader<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"createProgram\"><a href=\"#createProgram\" aria-label=\"createProgram permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>createProgram</h3>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/blob/master/js/Shader.js#L36\">createProgram code on github</a> </p>\n</blockquote>\n<p>The <code class=\"language-text\">createProgram</code> function creates the program, attaches the shaders, links the program, and also throws errors if we encounter any Errors.\nAnd finally returns the program. </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token function\">createProgram</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">createProgram</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">attachShader</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>vertexShader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">attachShader</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fragmentShader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">linkProgram</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">getProgramParameter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token constant\">LINK_STATUS</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Unable to initialize program '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">getProgramInfoLog</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>program<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"getShaderError\"><a href=\"#getShaderError\" aria-label=\"getShaderError permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>getShaderError</h3>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/blob/master/js/Shader.js#L75\">getShaderError code on github</a>\nWe also have <code class=\"language-text\">getShaderError</code> method which is a helper method to get specific error message for specific shader, it also shows where the error happend in the source code with line number.</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token function\">getShaderError</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">shader<span class=\"token punctuation\">,</span> shaderString</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">getShaderParameter</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token constant\">COMPILE_STATUS</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> lines <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> reg <span class=\"token operator\">=</span> <span class=\"token regex\">/ERROR:\\s\\d+:(\\d+):/img</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> errorMsg <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">getShaderInfoLog</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    errorMsg<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span>reg<span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">match<span class=\"token punctuation\">,</span> g1<span class=\"token punctuation\">,</span> g2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      lines<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">+</span>g1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> message <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>gl<span class=\"token punctuation\">.</span><span class=\"token function\">getShaderInfoLog</span><span class=\"token punctuation\">(</span>shader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    message <span class=\"token operator\">=</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\\n'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    message<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      msg<span class=\"token punctuation\">:</span> message<span class=\"token punctuation\">,</span>\n      line<span class=\"token punctuation\">:</span> lines\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"Other-Classes\"><a href=\"#Other-Classes\" aria-label=\"Other Classes permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Other Classes</h2>\n<p><code class=\"language-text\">Shader</code> class was the most important for this project. We also have <code class=\"language-text\">Camera</code>, <code class=\"language-text\">RawModel</code>, <code class=\"language-text\">Mesh</code> classes, which handle different parts of the WebGL context.</p>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/tree/master/js\">see all the classes on Github</a></p>\n</blockquote>\n<h2 id=\"Setup\"><a href=\"#Setup\" aria-label=\"Setup permalink\" class=\"gatsby-remark-autolink\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setup</h2>\n<p>In the end, I also used <a href=\"https://ace.c9.io/\">Ace</a> library to get my code editor up and running. (which was easy)</p>\n<blockquote>\n<p><a href=\"https://github.com/anuraghazra/ShaderExpo/blob/master/index.js\">see index.js setup</a></p>\n</blockquote>\n<p>I also used some different shaders from <a href=\"https://glslsandbox.com\">GLSL Sandbox</a> to check things out and see the capabilities of ShaderExpo.</p>","fields":{"slug":"/case-studies/shader-expo"},"frontmatter":{"demo":"//anuraghazra.github.io/ShaderExpo","iframe":"//www.youtube.com/embed/rtPhA041U4U/?modestbranding=1&showinfo=0&autohide=1&rel=0","src":"//github.com/anuraghazra/ShaderExpo","title":"ShaderExpo","info":{"idea":"The basic idea of the project was to create a real-time WebGL shader editor with linting and on the fly updates.","links":[["GLSL Sandbox","https://glslsandbox.com"],["ShaderExpo on AwesomeWebGL","https://github.com/sjfricke/awesome-webgl#glsl-editors"],["Jonas Wagner on Github from where i found some snippets","https://github.com/jwagner"]],"tech":["Javascript","HTML5 Canvas","WebGL"]}}}},"pageContext":{"slug":"/case-studies/shader-expo"}},"staticQueryHashes":["1033876704"]}