canvas+webgl实现可修改参数涡旋虫洞穿越动画效果代码
代码语言:html
所属分类:动画
代码描述:canvas+webgl实现可修改参数涡旋虫洞穿越动画效果代码
代码标签: canvas webgl 修改 参数 涡旋 虫洞 穿越 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { height: 100vh; margin: 0; } body, html, #glcanvas { overflow: hidden } canvas { display: block; width: 100vw; height: 100vh; } </style> </head> <body translate="no"> <canvas id="glcanvas"></canvas> <script id="vertex-shader" type="x-shader/x-vertex"> attribute vec2 a_position; void main() { gl_Position = vec4(a_position, 0.0, 1.0); } </script> <script id="fragment-shader" type="x-shader/x-fragment"> #ifdef GL_ES precision mediump float; #endif uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; uniform bool u_pattern; uniform float u_swirl; uniform float u_detail; uniform float u_rotationSpeed; uniform bool u_warp; uniform float u_warpIntensity; uniform float u_reflection; uniform float u_movementSpeed; uniform float u_color; uniform bool u_highContrast; uniform float u_discard; vec3 palette(float t, float factor) { vec3 a = vec3(0.5) + 0.3 * sin(vec3(0.1, 0.3, 0.5) * factor); vec3 b = vec3(0.5) + 0.3 * cos(vec3(0.2, 0.4, 0.6) * factor); vec3 c = vec3(1.0) + 0.5 * sin(vec3(0.3, 0.7, 0.9) * factor); vec3 d = vec3(0.25, 0.4, 0.55) + 0.2 * cos(vec3(0.5, 0.6, 0.7) * factor); return a + b * cos(6.28318 * (c * t + d)); } vec3 paletteContrasted(float t, float factor) { vec3 a = vec3(0.5) + 0.3 * sin(vec3(0.1, 0.3, 0.5) * factor); vec3 b = vec3(0.5) + 0.3 * cos(vec3(0.2, 0.4, 0.6) * factor); vec3 c = vec3(1.0) + 0.5 * sin(vec3(0.3, 0.7, 0.9) * factor); vec3 d = vec3(0.25, 0.4, 0.55) + 0.2 * cos(vec3(0.5, 0.6, 0.7) * factor); return a + b * tan(6.28318 * (c * t + d)); } float hash(vec3 p) { p = 50.0 * fract(p * 0.3183099 + vec3(0.71, 0.113, 0.5)); return -1.0 + 2.0 * fract(p.x * p.y * p.z * (p.x + p.y + p.z)); } float noiseF(vec3 p) { vec3 i = floor(p); vec3 f = fract(p); float a = hash(i); float b = hash(i + vec3(1.0, 0.0, 0.0)); float c = hash(i + vec3(0.0, 1.0, 0.0)); float d = hash(i + vec3(1.0, 1.0, 0.0)); float e = hash(i + vec3(0.0, 0.0, 1.0)); float f1 = hash(i + vec3(1.0, 0.0, 1.0)); float g = hash(i + vec3(0.0, 1.0, 1.0)); float h = hash(i + vec3(1.0, 1.0, 1.0)); vec3 u = f * f * (3.0 - 2.0 * f); return mix(mix(mix(a, b, u.x), mix(c, d, u.x), u.y), mix(mix(e, f1, u.x), mix(g, h, u.x), u.y), u.z); } vec3 warp(vec3 p) { vec3 offset = vec3(noiseF(p + u_time)); return p + offset; } vec3 getRayDirection(vec2 uv, vec3 camPos, vec3 camForward, vec3 camRight, vec3 camUp, float fov) { vec3 dir = camForward + uv.x * camRight * fov + uv.y * camUp * fov; return normalize(dir); } float oscillate(float time, float minVal, float maxVal) { float sineWave = sin(time); float normalizedSine = (sineWave + 1.0) / 2.0; return mix(minVal, maxVal, normalizedSine); } float waveX(float z){ return sin((z + u_time) * 0.05) * 20.0; } float waveXOffset(float z, float zOffset) { return sin((z + zOffset + u_time) * 0.05) * 20.0; } float tubeSDF(vec3 p, float outerRadius, float innerRadius) { p.x += waveX(p.z); p.y += waveX(p.z); if(u_warp){ p += warp(p * u_warpIntensity); } float radialDist = length(p.xy); float outerDist = radialDist - outerRadius; float innerDist = innerRadius - radialDist; return max(outerDist, innerDist); } float sceneSDF(vec3 p, vec3 camPos) { float tube = tubeSDF(p, 25.0, 20.0); return min(tube, 1.0); } vec3 calculateNormal(vec3 p, float epsilon) { vec3 d = vec3(epsilon, 0.0, 0.0); return normalize(vec3( sceneSDF(p + d.xyy, p) - sceneSDF(p - d.xyy, p), sceneSDF(p + d.yxy, p) - sceneSDF(p - d.yxy, p), sceneSDF(p + d.yyx, p) - sceneSDF(p - d.yyx, p) )); } vec3 reflectColor(vec3 worldPos, vec3 camPos, vec3 rayDir) { vec3 normal = calculateNormal(worldPos, 0.0); vec3 reflectedDir = reflect(rayDir, normal); vec3 environmentColor = palette(length(worldPos * 0.02), u_color); return environmentColor; } vec3 getColor(vec3 worldPos, vec3 camPos, vec3 rayDir) { float tubeDis.........完整代码请登录后点击上方下载按钮下载查看
网友评论0