webgl+wtc实现三维环面动画效果代码
代码语言:html
所属分类:三维
代码描述:webgl+wtc实现三维环面动画效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { background: #333; color: #fff; font-family: sans-serif; } body, html { margin: 0; overflow: hidden; padding: 0; } canvas { width:100%; height: 100%; } </style> </head> <body> <script type="text/fragment" id="fragShader">#version 300 es precision highp float; uniform vec2 u_resolution; uniform float u_time; uniform vec2 u_mouse; uniform sampler2D s_noise; uniform vec3 u_cp; in vec2 v_uv; out vec4 c; /* Shading constants */ /* --------------------- */ const vec3 LP = vec3(-0.6, 0.7, -0.3); // light position const vec3 LC = vec3(.85,0.80,0.70); // light colour const vec3 HC1 = vec3(.5, .4, .3); // hemisphere light colour 1 const vec3 HC2 = vec3(0.1,.1,.6)*.5; // hemisphere light colour 2 const vec3 HLD = vec3(0,1,0); // hemisphere light direction const vec3 BC = vec3(0.25,0.25,0.25); // back light colour const vec3 FC = vec3(1.30,1.20,1.00); // fresnel colour const float AS = .5; // ambient light strength const float DS = 1.; // diffuse light strength const float BS = .3; // back light strength const float FS = .3; // fresnel strength /* Raymarching constants */ /* --------------------- */ const float MAX_TRACE_DISTANCE = 10.; // max trace distance const float INTERSECTION_PRECISION = 0.001; // precision of the intersection const int NUM_OF_TRACE_STEPS = 256; // max number of trace steps const float STEP_MULTIPLIER = 1.; // the step mutliplier - ie, how much further to progress on each step /* Structures */ /* ---------- */ struct Camera { vec3 ro; vec3 rd; vec3 forward; vec3 right; vec3 up; float FOV; }; struct Surface { float len; vec3 position; vec3 colour; float id; float steps; float AO; }; struct Model { float dist; vec3 colour; float id; }; /* Utilities */ /* ---------- */ vec2 toScreenspace(in vec2 p) { vec2 uv = (p - 0.5 * u_resolution.xy) / min(u_resolution.y, u_resolution.x); return uv; } mat2 R(float a) { float c = cos(a); float s = sin(a); return mat2(c, -s, s, c); } Camera getCamera(in vec2 uv, in vec3 pos, in vec3 target) { vec3 f = normalize(target - pos); vec3 r = normalize(vec3(f.z, 0., -f.x)); vec3 u = normalize(cross(f, r)); float FOV = .8+cos(u_time)*.5; return Camera( pos, normalize(f + FOV * uv.x * r + FOV * uv.y * u), f, r, u, FOV ); } //-------------------------------- // Modelling //-------------------------------- Model model(vec3 p) { p.xz *= R(u_time*2.); p.xy *= R(.3); p.x -= .5; p.y -= .5; float d = abs(-(length(vec2(p.y, length(p.xz)-2.))-1.8+cos(u_time)*.3))-.1; float t = u_time * 10.; // d = length(vec2(d, length(mod(p,.1)-.05)-.01))-.04; // float a = atan(p.x, p.z); // vec3 colour = vec3(smoothstep(0.,.001, cos(a*20.))) * (cos(t-a*.1)*.5+.5); vec3 colour = vec3(0); return Model(d, colour, 1.); } Model map( vec3 p ){ return model(p); } /* Modelling utilities */ /* ---------- */ // Calculates the normal by taking a very small distance, // remapping the function, and getting normal for that vec3 calcNormal( in vec3 pos ){ vec3 eps = vec3( 0.001, 0.0, 0.0 ); vec3 nor = vec3( map(pos+eps.xyy).dist - map(pos-eps.xyy).dist, map(pos+eps.yxy).dist - map(pos-eps.yxy).dist, map(pos+eps.yyx).dist - map(pos-eps.yyx).dist ); return normalize(nor); } //-------------------------------- // Raymarcher //-------------------------------- Surface march( in Camera cam ){ float h = 1e4; // local distance float d = 0.; // ray depth float id = -1.; // surace id float s = 0.; // number of steps float ao = 0.; // march space AO. Simple weighted accumulator vec3 p; // ray position vec3 c; // surface colour for( int i=0; i< NUM_OF_TRACE_STEPS ; i++ ) { if( abs(h) < INTERSECTION_PRECISION || d > MAX_TRACE_DISTANCE ) break; p = cam.ro+cam.rd*d; Model m = map( p ); h = m.dist; d += h * STEP_MULTIPLIER; id = m.id; s +.........完整代码请登录后点击上方下载按钮下载查看
网友评论0