twgl+webgl实现三维木柱旋转拼接动画效果代码
代码语言:html
所属分类:三维
代码描述:twgl+webgl实现三维木柱旋转拼接动画效果代码
代码标签: twgl webgl 三维 木柱 旋转 拼接 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> html { height: 100%; } body { background: #333; overflow: hidden; padding: 0; margin: 0; width: 100%; height: 100%; display: flex; align-items: center; } canvas { height: 100%; width: 100%; } </style> </head> <body > <canvas id="canvas"></canvas> <!-- VertexShader code here --> <script id="vertexShader" type="x-shader/x-vertex">#version 300 es #if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif precision highp float; in vec4 position; void main() { gl_Position = vec4( position ); } </script> <!-- FragmentShader code here --> <script id="fragmentShader" type="x-shader/x-fragment">#version 300 es precision highp float; out vec4 fragColor; uniform vec2 u_resolution; uniform vec4 u_mouse; uniform float u_time; uniform sampler2D iChannel0; uniform sampler2D iChannel1; #define R u_resolution #define T u_time #define M u_mouse #define PI 3.14159265 #define PI2 6.28318530 #define MIN_DIST .1e-5 #define MAX_DIST 15. mat2 rot(float a){ return mat2(cos(a),sin(a),-sin(a),cos(a)); } float hash21(vec2 p){return fract(sin(dot(p,vec2(23.43,84.21)))*4832.3234);} float lsp(float b, float e, float t){return clamp((t-b)/(e-b),0.,1.); } float eoc(float t){return (t = t-1.)*t*t+1.; } float opx(in float d, in float z, in float h){ vec2 w = vec2( d, abs(z) - h ); return min(max(w.x, w.y), 0.) + length(max(w, 0.)); } vec3 hp,hitpoint; vec2 gid, sid; float speed=0.,tspeed=0.,tmod=0.,ga1=0.,ga2=0.,ga3=0.,ga4=0.; mat2 crot,srot; const float size = 2.; const float hlf = 1.; const float tk = .2; vec2 map(vec3 p) { vec2 res = vec2(1e5,0.); p.y += speed; vec2 uv = mod(p.xy+hlf,size)-hlf; vec2 id = floor((p.xy+hlf)/size); float rnd = hash21(id); if(rnd>.5) uv.y = -uv.y; rnd=fract(rnd*32.232); float sn = hash21(id.yx)*15.; sn = mod(sn,10.); float t1 = lsp(sn,sn+1.,tmod); float t2 = lsp(sn+2.,sn+3.,tmod); t1 = eoc(t1); t1 = t1*t1*t1; t2 = eoc(t2); t2 = t2*t2*t2; crot = rot((t1+t2)*1.5707); uv.xy *= crot; vec3 q = vec3(uv.xy,p.z); vec2 u2 = vec2(length(uv-hlf),length(uv+hlf)); vec2 q2 = u2.x<u2.y ? uv-hlf : uv+hlf; float d1 = length(uv)-(hlf*.925); float d2 = abs(length(q2)-hlf)-tk; if(rnd>.85) d2 = min(length(q.x)-tk,length(q.y)-tk); d2 = max(d1,-d2); d2 = opx(d2,q.z+.45,7.5)-.025; if(d2<res.x) { res=vec2(d2,2.); hp=q; gid=id; } return res; } vec3 normal(vec3 p, float t) { float e = MIN_DIST*t; vec2 h =vec2(1,-1)*.5773; vec3 n = h.xyy * map(p+h.xyy*e).x+ h.yyx * map(p+h.yyx*e).x+ h.yxy * map(p+h.yxy*e).x+ h.xxx * map(p+h.xxx*e).x; return normalize(n); } vec2 marcher(vec3 ro, vec3 rd, inout vec3 p) { float d=0.,m=0.; for(int i=0;i<86;i++){ vec2 t = map(p); d += i<32? t.x*.5:t.x; m = t.y; p = ro + rd * d; if(t.x<d*MIN_DIST||d>MAX_DIST) break; } return vec2(d,m); } vec3 tex3D(sampler2D t, in vec3 p, in vec3 n ){ n.xy*=srot; n = max(abs(n), MIN_DIST); n /= dot(n, vec3(1)); vec3 tx = texture(t, p.yz).xyz; vec3 ty = texture(t, p.zx).xyz; vec3 tz = texture(t, p.xy).xyz; return mat3(tx*tx, ty*ty, tz*tz)*n; } vec4 render(inout vec3 ro, inout vec3 rd, inout vec3 ref, inout float d, vec2 uv) { vec3 C = vec3(0); float m = 0.; vec3 p = ro; vec2 ray = marcher(ro,rd,p); d=ray.x;m=ray.y; // save globals post march sid = gid; hitpoint = hp; srot=crot; if(d<MAX_DIST) { vec3 n = normal(p,d); vec3 lpos = vec3(2,8,12); vec3 l = normalize(lpos-p); float diff = clamp(dot(n,l),0.,1.); float shdw = 1.; for( float t = .01; t < 10.; ) { float h = map(p + l*t).x; if( h<MIN_DIST ) { shdw = 0.; break; } shdw = min(shdw, 10.*h/t); t += h; if( shdw<MIN_DIST ) break; } diff = mix(diff,diff*shdw,.45); float spec = .75 * pow(max(dot(normalize(p-ro),reflect(normalize(lpos),n)),0.),24.); vec3 h = vec3(1.); if(m == 2.) { float rnd = hash21(sid); h = rnd>.675?tex3D(iChannel1,abs(hitpoint*1.5),n).rgb:tex3D(iChannel0,abs(hitpoint*1.),n).rgb; } if(m == 3.) h = vec3(.005); ref = h; C = h * diff; ro = p+n*.0025; rd = reflect(rd,n); } return vec4(C,d); } vec3 FC = vec3(.0225,.0125,.0025); void main() { vec2 F = gl_FragCoord.xy; speed .........完整代码请登录后点击上方下载按钮下载查看
网友评论0