renderer = createCanvas(windowWidth, windowHeight,WEBGL);
sh = createShader(vert,frag);
sh.setUniform("u_resolution", [width,height]);
sh.setUniform("u_lightDir", [-1,-0.1,0]);
setCol(sh,'#FFFFFF','#111111');
rotateX(frameCount/CYCLE/2*TWO_PI);
rotateY(frameCount/CYCLE/2*TWO_PI);
rotateZ(frameCount/CYCLE/3*TWO_PI);
noisedSphere(min(width,height)*0.25,50,50);
function noisedSphere(_sphereRadius,dx,dy)
let geometry = new p5.Geometry(dx,dy);
let noiseAmount = map(sin(frameCount/30),-0.99,-0.2,0,-0.5,true) ;
for(let yi = 0; yi <= dy; yi ++)
let yRadian = map(yi,0,dy,PI/2,-PI/2);
let y = sin(yRadian)*_sphereRadius;
let radius = cos(yRadian)*_sphereRadius;
for(let xi = 0; xi <= dx; xi++)
if(yi == 0 || yi == dy){x = 0; z =0;}
let nv = (noise(x/radius,y+frameCount/30,z/radius));
nv = map(nv,0,1,1,1+ noiseAmount);
geometry.vertices[xi + (dx+1)*yi] = createVector(x*nv,y*nv,z*nv);
for(let i=geometry.faces.length-1; i>=0; i-- ){
if(i < dx*2 && i %2 == 0 || i > geometry.faces.length-dx*2 && i %2 == 1)geometry.faces[i] = [];
for(let i=geometry.faces.length-1; i>=0; i-- ){
if(geometry.faces[i].length == 0)geometry.faces.splice(i,1);
geometry.computeNormals();
geometry.averageNormals();
function drawGeometry(_geo,_id = 'gId',_renderer = renderer)
_renderer.createBuffers(_id, _geo);
_renderer.drawBuffers(_id);
function setCol(shader,colStr,shadowColStr)
let colArray = col._array;
shader.setUniform("u_col",colArray);
let shadowCol = color(shadowColStr);
let shadowColArray = shadowCol._array;
shader.setUniform("u_Scol",shadowColArray);