Last active
March 21, 2025 00:39
-
-
Save cskonopka/67d3a95f83db884fdadc92a3c0a43ecf to your computer and use it in GitHub Desktop.
webglo-working-example.html
This file contains hidden or 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
| <!-- | |
| File: webglo-example.html | |
| Creator: Christopher Konopka (cskonopka) | |
| Project: https://github.com/vondas-network/webglo | |
| Website: webglo.btc.us | |
| Ordinal: https://ordinals.com/content/5518d36079b3cc854dba0bd6497ec078fbaa996ebd53e908150c845d6a56a463i0 | |
| Basic example of the webglo file. It’s an HTML file with embedded WebGL using Javascript. | |
| The file was uploaded to the Bitcoin blockchain using the Ordinals protocol as an “inscription”. | |
| --> | |
| <html> | |
| <script type="text/javascript"> | |
| var GL; | |
| var shaderId; | |
| var vertexBuffer; | |
| var indexBuffer; | |
| var timer = 0; | |
| function initWebGL(){ | |
| var canvas = document.getElementById("glcanvas"); | |
| GL = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); | |
| if (!GL) { | |
| alert("Unable to initialize WebGL. Your browser may not support it."); | |
| } | |
| GL.clearColor(1.0, 0.0, 0.0, 1.0); | |
| GL.clear(GL.COLOR_BUFFER_BIT| GL.DEPTH_BUFFER_BIT); | |
| initShaderProgram(); | |
| initBuffers(); | |
| } | |
| function initShaderProgram(){ | |
| shaderId = GL.createProgram(); | |
| var vertId = GL.createShader(GL.VERTEX_SHADER); | |
| var fragId = GL.createShader(GL.FRAGMENT_SHADER); | |
| var vert = document.getElementById("vertScript").text; | |
| var frag = document.getElementById("fragScript").text; | |
| GL.shaderSource(vertId, vert); | |
| GL.shaderSource(fragId, frag); | |
| GL.compileShader(vertId); | |
| GL.compileShader(fragId); | |
| if (!GL.getShaderParameter(vertId, GL.COMPILE_STATUS)) { | |
| alert("Vertex Shader Compiler Error: " + GL.getShaderInfoLog(id)); | |
| GL.deleteShader(vertId); | |
| return null; | |
| } | |
| if (!GL.getShaderParameter(fragId, GL.COMPILE_STATUS)) { | |
| alert("Fragment Shader Compiler Error: " + GL.getShaderInfoLog(id)); | |
| GL.deleteShader(fragId); | |
| return null; | |
| } | |
| GL.attachShader(shaderId, vertId); | |
| GL.attachShader(shaderId, fragId); | |
| GL.linkProgram(shaderId); | |
| if (!GL.getProgramParameter(shaderId, GL.LINK_STATUS)) { | |
| alert("Shader Linking Error: " + GL.getProgramInfoLog(shader)); | |
| } | |
| } | |
| function initBuffers(){ | |
| var vertices = new Float32Array( [ | |
| -1.0, -1.0, 0.0, | |
| -1.0, 1.0, 0.0, | |
| 1.0, 1.0, 0.0, | |
| 1.0, -1.0, 0.0 | |
| ]); | |
| vertexBuffer = GL.createBuffer(); | |
| GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); | |
| GL.bufferData(GL.ARRAY_BUFFER, vertices.byteLength, GL.STATIC_DRAW); | |
| GL.bufferSubData(GL.ARRAY_BUFFER, 0, vertices ); | |
| var indices = new Uint16Array([ 0,1,3,2 ]); | |
| indexBuffer = GL.createBuffer(); | |
| GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); | |
| GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indices.byteLength, GL.STATIC_DRAW); | |
| GL.bufferSubData(GL.ELEMENT_ARRAY_BUFFER, 0, indices ); | |
| } | |
| window.requestAnimFrame = ( function() { | |
| return window.requestAnimationFrame || | |
| window.webkitRequestAnimationFrame || | |
| window.mozRequestAnimationFrame || | |
| window.oRequestAnimationFrame || | |
| window.msRequestAnimationFrame || | |
| function(callback) { | |
| window.setTimeout(callback, 1000 / 60); | |
| }; | |
| } ) (); | |
| function animationLoop(){ | |
| requestAnimFrame( animationLoop ); | |
| render(); | |
| } | |
| function render(){ | |
| timer+=.1; | |
| GL.useProgram(shaderId); | |
| var uID = GL.getUniformLocation(shaderId, "uTime"); | |
| GL.uniform1f(uID, timer); | |
| var attId = GL.getAttribLocation(shaderId, "position"); | |
| GL.enableVertexAttribArray(attId); | |
| GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); | |
| GL.vertexAttribPointer( attId, 3, GL.FLOAT, false, 0, 0); | |
| GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); | |
| GL.drawElements(GL.TRIANGLE_STRIP, 4, GL.UNSIGNED_SHORT, 0); | |
| } | |
| function start(){ | |
| initWebGL(); | |
| animationLoop(); | |
| } | |
| </script> | |
| <script id="vertScript" type="text/glsl"> | |
| #ifdef GL_ES | |
| precision lowp float; | |
| #endif | |
| attribute vec3 position; | |
| void main(void) { | |
| gl_Position = vec4(position,1.0); | |
| } | |
| </script> | |
| <script id="fragScript" type="text/glsl"> | |
| #ifdef GL_ES | |
| precision mediump float; | |
| #endif | |
| #define PI 3.14159265359 | |
| uniform vec2 uResolution; | |
| uniform vec2 uMouse; | |
| uniform float uTime; | |
| float plot(vec2 st, float pct){ | |
| return smoothstep( pct-0.02, pct, st.y) - | |
| smoothstep( pct, pct+0.02, st.y); | |
| } | |
| void main() { | |
| vec2 st = gl_FragCoord.xy/vec2(640,480); | |
| st -= 0.5; // becomes -0.5 to 0.5 | |
| st *= 12.0; | |
| float pct2 = 0.0; | |
| pct2 = distance(st,vec2(0.5)); | |
| float y3 = sin(cos((st.y)*(0.10)))-sin(st.x+st.y*02.2); | |
| float y = smoothstep(1.2-(sin(((y3)))*(cos(st.y/-9.2))),0.5,st.x) - smoothstep(0.5,0.1,(st.x*0.2))+(sin(st.x-(uTime*.0412))); | |
| float y2 = smoothstep(04.91,02.5,st.y+st.x) - smoothstep(0.481,0.918,st.y); | |
| vec3 colorA = vec3(y*y2)-(y3-(0.14))*(sin(st.x-(uTime*.02412))); | |
| colorA = (1.0)*colorA*vec3(.020+(sin(((y3+y)))+(cos(pct2*-0.2))),0.120,(0.10+(sin(y3)))); | |
| float y4 = cos(cos((st.x)*(0.13)*sin(0.23))); | |
| float y5 = smoothstep(0.2,0.25,0.3) - smoothstep(0.25,0.31,(st.y*0.12)); | |
| float y6 = smoothstep(0.9+(st.x*0.012),0.1915,st.y+cos(st.y)) - smoothstep(0.641,0.8191,(st.x+st.y)*0.2); | |
| vec3 colorB = vec3(y4+y5)-(y3*(0.913))*(sin(st.x+(uTime*.031592))); | |
| colorB = (1.0)*colorB*vec3(.920,0.95030,(0.20-y6))*(sin(st.y-(uTime*.032412))); | |
| // a. The DISTANCE from the pixel to the center | |
| vec2 bl = step(vec2(0.5),st); | |
| float pct = bl.x * bl.y; | |
| vec3 colorMix = vec3(0.0); | |
| colorMix = mix(colorA*0.432, colorB+0.3892, 0.983*(sin(((y6+y2)))*(cos(pct2/-2.2)))); | |
| gl_FragColor = vec4(colorMix,1.0); | |
| } | |
| </script> | |
| <body style="margin:0px;" onload=start()> | |
| <canvas id="glcanvas" width=640 height=480 style="height:100%; width:100%; margin:auto; display:block"> | |
| Oops, browser has no <code> canvas </code> tag support | |
| </canvas> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment