Skip to content

Instantly share code, notes, and snippets.

@strangerintheq
Last active January 1, 2019 23:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save strangerintheq/89c65c28834ecbb3b96a6e08cd665974 to your computer and use it in GitHub Desktop.
Save strangerintheq/89c65c28834ecbb3b96a6e08cd665974 to your computer and use it in GitHub Desktop.
Kali's fractal colored
<!doctype html>
<html>
<body>
<style>
body {
margin: 0; overflow: hidden
}
canvas {
position: absolute;
width: 100%;
height: 100%;
}
</style>
<script>
var gl = glx();
var vertices1 = gl.buffer([
-1, 3,
-1, -1,
3, -1,
]);
var vertCode =
`attribute vec2 coordinates;
void main(void) {
gl_Position = vec4(coordinates.xy, 0.0, 1.0);
}`;
var fragCode =
`precision highp float;
uniform vec4 mr;
void main(void) {
vec2 p = gl_FragCoord.xy;
vec2 q = 5.*(p + p - mr.ba) / mr.b;
for(int i = 0; i < 7; i++){
vec2 c = mr.xy / mr.b;
q = abs(q)/dot(q,q) - mr.xy/mr.zw;
}
gl_FragColor = vec4(q, q.x/q.y, 1.0);
}`;
var shaderProgram = gl.program(vertCode, fragCode);
var coords = shaderProgram.attribute("coordinates", 2);
var mr = shaderProgram.uniform('4f', 'mr');
shaderProgram.use();
updateMouse();
mainLoop();
window.addEventListener('mousemove', listener);
window.addEventListener('touchmove', listener);
function listener(e) {
updateMouse(e.touches ? e.touches[0] : e);
gl.draw(3);
}
function updateMouse(e) {
var h = gl.gl.drawingBufferHeight;
var w = gl.gl.drawingBufferWidth;
mr.set(e ? e.clientX : 0, e ? h - e.clientY: 0, w, h);
}
function mainLoop() {
if (gl.ensureSizes()) {
coords.bind(vertices1);
gl.draw(3);
}
requestAnimationFrame(mainLoop)
}
function glx() {
var canvas = document.createElement('canvas');
document.body.appendChild(canvas);
var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
return {
gl: gl,
draw: draw,
buffer: buffer,
program: program,
ensureSizes: ensureSizes
};
function draw(count) {
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
gl.clearColor(0, 0, 0, 1);
gl.drawArrays(gl.TRIANGLES, 0, count);
}
function program(vs, fs) {
var pid = gl.createProgram(); // program id
shader(vs, gl.VERTEX_SHADER);
shader(fs, gl.FRAGMENT_SHADER);
gl.linkProgram(pid);
return {uniform: uniform, attribute: attribute, use: use};
function use() {
gl.useProgram(pid);
}
function attribute(name, count) {
var al = gl.getAttribLocation(pid, name);
return {bind: bind};
function bind(buffer) {
buffer.bind();
gl.vertexAttribPointer(al, count, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(al);
}
}
function uniform(type, name) {
var ul = gl.getUniformLocation(pid, name);
return {set: set};
function set(v1, v2, v3, v4) {
gl['uniform' + type](ul, v1, v2, v3, v4);
}
}
function shader(src, type) {
var sid = gl.createShader(type);
gl.shaderSource(sid, src);
gl.compileShader(sid);
gl.attachShader(pid, sid);
}
}
function buffer(data) {
var array = new Float32Array(data);
var buffer = gl.createBuffer();
var type = gl.ARRAY_BUFFER;
gl.bindBuffer(type, buffer);
gl.bufferData(type, array, gl.STATIC_DRAW);
gl.bindBuffer(type, null);
return {bind: bind};
function bind() {
gl.bindBuffer(type, buffer);
}
}
function ensureSizes() {
if (canvas.clientWidth !== canvas.width ||
canvas.clientHeight !== canvas.height) {
canvas.width = canvas.clientWidth;
canvas.height = canvas.clientHeight;
return true;
}
}
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment