Impressum
attribute vec3 inputPosition; attribute vec4 inputColor; varying vec3 forFragColor; void main() { forFragColor = inputColor.rgb; gl_Position = vec4(inputPosition*1000.0, 1.0); }
// shader by Franz Mandl precision highp float; uniform float thetime; uniform float resx; uniform float resy; vec2 sco; vec3 lightPos=vec3(0,.7,.9),cres,rs,rd,sp; float screenYszf=400.0,screenXszf=512.0,cellsize; vec3 shade( vec3 pos ) { vec3 wDir = normalize(rd); float dist=length(rs-pos); return dist*(vec3(1.0,1.0,1.0)*pow(dot(normalize(lightPos-pos),wDir),2.0)); } float rand(float seedx,float seedy,int level){ return abs(sin(pow(abs(seedx),float(level)))+cos(pow(abs(seedy),float(level)))); } float getHeight(vec3 sp){ float height=0.0; for(int lcounter=0;lcounter<10;lcounter++){ height+=rand(sp.x,sp.z,lcounter)/pow(2.0,float(lcounter)+1.0); } return height; } void castLand(){ cellsize=.01; vec3 pos,norm,color;float tsp; float h1=0.0;float h2=0.0;float h3=0.0;float dist=0.0001; for (int iter=0;iter<160;iter++){ dist+=dist*1.09; sp=rs+rd*dist; if (dist>10.0) break; h1=getHeight(sp); h2=getHeight(sp+vec3(cellsize,0,0)); h3=getHeight(sp+vec3(0,0,cellsize)); cross(vec3(cellsize,h2,0.0)-vec3(.0,h1,.0),(vec3(.0,h3,cellsize)-vec3(.0,h1,.0))); norm=normalize(norm); if (h1>sp.y) { // cres+=vec3(9.0,5.0,0.0)*fract(sin(dot(vec2(sp.z,sp.x*.9),vec2(999.0,.001)))*9.0)/9.0+.1; break; } } cres+=shade(rd)*sp; return; } void main(void) { sco.x=((gl_FragCoord.x-screenXszf/2.0)/screenXszf)*2.0*resx/resy; sco.y=((gl_FragCoord.y-screenYszf/2.0)/screenYszf)*2.0; rd=normalize(vec3(0.0,-0.2,0.8) + sco.y*vec3(0,1,0)+sco.x*vec3(1,0,0)); rs=vec3(0,1.5,1)+vec3(0.3,0,0)*thetime/200000.0; cres=vec3(0); castLand(); gl_FragColor = vec4(cres,1); }