cesium 效果篇——雨水涟漪

本文介绍了如何在Cesium中实现雨水涟漪的视觉效果,结合模型、后渲染雨水和polygon,利用shader中的噪声函数。代码来源于shadertoy,通过循环和噪声函数创建雨滴,并应用平滑步骤和正弦函数来模拟涟漪。最终效果展示并分享了部分代码,强调了耐心和不断学习的重要性。
摘要由CSDN通过智能技术生成

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);
}

总结

世界那么大,少点焦虑,无非是迟一点。

要实现涟漪效果,可以利用Cesium的材质系统以及shader编写来实现。以下是一个简单的示例代码: ```javascript // 创建线段 var line = viewer.entities.add({ polyline: { positions: Cesium.Cartesian3.fromDegreesArray([0, 0, 10, 0]), width: 5, material: new Cesium.PolylineGlowMaterialProperty({ color: Cesium.Color.BLUE, glowPower: 0.2 }) } }); // 设置shader line.polyline.material.shaderSource = Cesium.PolylineGlowMaterialAppearance.DEFAULT_APPEARANCE.vertexShaderSource; line.polyline.material.uniforms.color = Cesium.Color.BLUE; line.polyline.material.uniforms.glowWidth = 0.05; line.polyline.material.uniforms.glowPower = 0.5; line.polyline.material.uniforms.taperPower = 0.1; // 动态修改涟漪效果 viewer.clock.onTick.addEventListener(function(clock){ var time = clock.currentTime.secondsOfDay; var glowPower = Math.max(Math.sin(time), 0); line.polyline.material.uniforms.glowPower = glowPower; }); ``` 在上面的代码中,我们首先创建一个线段实体,并设置了它的材质为PolylineGlowMaterialProperty。然后我们通过设置shaderSource和uniforms来控制材质的属性。其中,glowWidth用于控制涟漪的宽度,glowPower用于控制涟漪的强度,taperPower用于控制涟漪的逐渐减弱程度。最后,我们通过监听viewer的时钟事件,动态修改glowPower来实现涟漪效果的动画效果。 需要注意的是,由于涟漪效果是通过shader来实现的,因此需要在支持WebGL的浏览器中才能正常显示。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值