cesium 效果篇——雨水涟漪
前言
这几天花了点时间改造了下雨的效果,同时也把一些好的效果也移植到了一起,最后呈现出来展示效果图感觉还可以,先拿出来小秀一下。
效果图
思路
整个场景主要由模型、后渲染的雨水、以及polygon完成,shader主要是对噪声函数的运用,目前我也更多只是把一些效果作了一些移植,核心部分代码也在啃,等有成果了,再一起对所有代码作一个注释和讲解吧。
代码
主要是shadertoy上的一个效果,具体可以看 shadertoy
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
float resolution = 10. * exp2(-3.*iMouse.x/iResolution.x);
vec2 uv = fragCoord.xy / iResolution.y * resolution;
vec2 p0 = floor(uv);
vec2 circles = vec2(0.);
for (int j = -MAX_RADIUS; j <= MAX_RADIUS; ++j)
{
for (int i = -MAX_RADIUS; i <= MAX_RADIUS; ++i)
{
vec2 pi = p0 + vec2(i, j);
#if DOUBLE_HASH
vec2 hsh = hash22(pi);
#else
vec2 hsh = pi;
#endif
vec2 p = pi + hash22(hsh);
float t = fract(0.3*iTime + hash12(hsh));
vec2 v = p - uv;
float d = length(v) - (float(MAX_RADIUS) + 1.)*t;
float h = 1e-3;
float d1 = d - h;
float d2 = d + h;
float p1 = sin(31.*d1) * smoothstep(-0.6, -0.3, d1) * smoothstep(0., -0.3, d1);
float p2 = sin(31.*d2) * smoothstep(-0.6, -0.3, d2) * smoothstep(0., -0.3, d2);
circles += 0.5 * normalize(v) * ((p2 - p1) / (2. * h) * (1. - t) * (1. - t));
}
}
circles /= float((MAX_RADIUS*2+1)*(MAX_RADIUS*2+1));
float intensity = mix(0.01, 0.15, smoothstep(0.1, 0.6, abs(fract(0.05*iTime + 0.5)*2.-1.)));
vec3 n = vec3(circles, sqrt(1. - dot(circles, circles)));
vec3 color = texture(iChannel0, uv/resolution - intensity*n.xy).rgb + 5.*pow(clamp(dot(n, normalize(vec3(1., 0.7, 0.5))), 0., 1.), 6.);
fragColor = vec4(color, 1.0);
}
总结
世界那么大,少点焦虑,无非是迟一点。