news 2026/4/23 11:17:02

Cesium进阶教程(1)在cesium后处理中使用shadertoy的代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cesium进阶教程(1)在cesium后处理中使用shadertoy的代码

本系列教程适合有前端基础以及一定三维GIS开发基础、想学习cesium高阶内容的同学,例如:WebGIS开发工程师、前端工程师、GIS专业学生和相关科研人员等。
视频版戳此处观看

01 什么是shader

在 Cesium 中,CustomShader是一个非常强大的接口,用来自定义图形渲染过程中的 GLSL 着色逻辑,让开发者可以对 3D Tiles、模型(Model)或 Primitive 等对象实现更灵活、复杂的视觉效果。
CustomShader让你可以在 Cesium 的标准渲染管线中插入自己的 GLSL 代码,从而控制模型的 顶点变换 和 片元着色 过程。 也就是说,你可以让模型发光、流动、闪烁、根据高度变色、按时间变化、根据法线方向渐变等。

02 基本原理

在 Cesium 中,每个 3D 模型或 Tileset 都会使用一个默认的渲染着色器(Shader Program)。 而CustomShader的作用就是允许你在保留 Cesium 默认功能的前提下,往其中注入自定义的 GLSL 代码。
它主要能影响两个阶段:

  • Vertex Shader 阶段(顶点处理)
  • Fragment Shader 阶段(像素着色)

在这些阶段里面可以获取到一些重要的数据:

|Corresponding AttributeinModel|variableinshader|Type|AvailableinVertex Shader?|AvailableinFragment Shader?|Description||--------------------------------|------------------|-------|---------------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------||`POSITION`|`positionMC`|`vec3`|Yes|Yes|Positioninmodel coordinates||`POSITION`|`positionWC`|`vec3`|No|Yes|Positioninworldcoordinates(WGS84ECEF`(x, y, z)`).Low precision.||`POSITION`|`positionEC`|`vec3`|No|Yes|Positionineye coordinates.||`NORMAL`|`normalMC`|`vec3`|Yes|No|Unit-length normal vectorinmodel coordinates.Only availableinthe vertex shader||`NORMAL`|`normalEC`|`vec3`|No|Yes|Unit-length normal vectorineye coordinates.Only availableinthe fragment shader||`TANGENT`|`tangentMC`|`vec3`|Yes|No|Unit-length tangent vectorinmodel coordinates.This is always a`vec3`.For models that provide a`w`component,that is removed after computing the bitangent vector.||`TANGENT`|`tangentEC`|`vec3`|No|Yes|Unit-length tangent vectorineye coordinates.This is always a`vec3`.For models that provide a`w`component,that is removed after computing the bitangent vector.||`NORMAL`&`TANGENT`|`bitangentMC`|`vec3`|Yes|No|Unit-length bitangent vectorinmodel coordinates.Only available when both normal and tangent vectors are available.||`NORMAL`&`TANGENT`|`bitangentEC`|`vec3`|No|Yes|Unit-length bitangent vectorineye coordinates.Only available when both normal and tangent vectors are available.||`TEXCOORD_N`|`texCoord_N`|`vec2`|Yes|Yes|`N`-thsetoftexture coordinates.||`COLOR_N`|`color_N`|`vec4`|Yes|Yes|`N`-thsetofvertex colors.This is always a`vec4`;ifthe model does not specify an alpha value,it is assumed to be1.||`JOINTS_N`|`joints_N`|`ivec4`|Yes|Yes|`N`-thsetofjoint indices||`WEIGHTS_N`|`weights_N`|`vec4`|

在cesium后处理中使用shadertoy的代码

我们也可以去shdertoy上找一些比较好的移植到cesium里面,比如我找了一个下雪的:https://www.shadertoy.com/view/ldsGDn

我们只需要把Shadertoy的代码做以下修改适配Cesium:

  1. 入口函数:
    ShaderToy 用mainImage(out vec4 fragColor, in vec2 fragCoord)
    Cesium 用void main(void),最终写gl_FragColor

  2. 内置变量替换:
    iResolution.xyczm_viewport.zw
    fragCoord.xygl_FragCoord.xy
    iTimeczm_frameNumber / 60.0(假设帧率 60fps)
    iMouse→ 没有鼠标交互,通常直接去掉或改为常量

  3. 最终颜色混合:
    在 Cesium 中需要和场景颜色混合,所以要读取colorTexture
    vec4 img = texture2D(colorTexture, v_textureCoordinates);gl_FragColor = img + vec4(acc, 1.0);

最终结果为:

constsnowShader=/*glsl*/`uniform sampler2D colorTexture; varying vec2 v_textureCoordinates; #define LIGHT_SNOW #ifdef LIGHT_SNOW #define LAYERS 50 #define DEPTH .5 #define WIDTH .3 #define SPEED .6 #else // BLIZZARD #define LAYERS 200 #define DEPTH .1 #define WIDTH .8 #define SPEED 1.5 #endif void main(void) { const mat3 p = mat3( 13.323122,23.5112,21.71123, 21.1212,28.7312,11.9312, 21.8112,14.7212,61.3934 ); vec2 resolution = czm_viewport.zw; vec2 fragCoord = gl_FragCoord.xy; // ShaderToy 的 iTime -> 用 frameNumber 模拟时间 float iTime = float(czm_frameNumber) / 60.0; // ShaderToy 的 uv 计算 vec2 uv = vec2(1.0, resolution.y / resolution.x) * fragCoord / resolution; vec3 acc = vec3(0.0); float dof = 5.0 * sin(iTime * 0.1); for (int i = 0; i < LAYERS; i++) { float fi = float(i); vec2 q = uv * (1.0 + fi * DEPTH); q += vec2( q.y * (WIDTH * mod(fi * 7.238917, 1.0) - WIDTH * 0.5), SPEED * iTime / (1.0 + fi * DEPTH * 0.03) ); vec3 n = vec3(floor(q), 31.189 + fi); vec3 m = floor(n) * 0.00001 + fract(n); vec3 mp = (31415.9 + m) / fract(p * m); vec3 r = fract(mp); vec2 s = abs(mod(q, 1.0) - 0.5 + 0.9 * r.xy - 0.45); s += 0.01 * abs(2.0 * fract(10.0 * q.yx) - 1.0); float d = 0.6 * max(s.x - s.y, s.x + s.y) + max(s.x, s.y) - 0.01; float edge = 0.005 + 0.05 * min(0.5 * abs(fi - 5.0 - dof), 1.0); acc += vec3(smoothstep(edge, -edge, d) * (r.x / (1.0 + 0.02 * fi * DEPTH))); } vec4 img = texture2D(colorTexture, v_textureCoordinates); gl_FragColor = img + vec4(acc, 1.0); }`;constsnowPost=newCesium.PostProcessStage({name:"snow",fragmentShader:snowShader,});viewer.scene.postProcessStages.add(snowPost);


看不明白没关系,需要上述视频教程+源码的同学可以直接
+下方小助手↓备注【cesium进阶】无偿获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 19:48:38

Cesium进阶教程(2)线性高度雾

本系列教程适合有前端基础以及一定三维GIS开发基础、想学习cesium高阶内容的同学&#xff0c;例如&#xff1a;WebGIS开发工程师、前端工程师、GIS专业学生和相关科研人员等。 视频版戳此处观看 文字版教程&#xff1a; Cesium进阶教程&#xff08;1&#xff09;在cesium后处理…

作者头像 李华
网站建设 2026/4/21 7:25:15

数据湖中的实时数据处理:Flink集成方案详解

数据湖中的实时数据处理&#xff1a;Flink集成方案详解 关键词&#xff1a;数据湖、实时数据处理、Apache Flink、流批一体、Hudi/Delta Lake 摘要&#xff1a;本文将带您深入理解数据湖与实时处理技术的融合场景&#xff0c;重点解析Apache Flink如何与数据湖&#xff08;如Hu…

作者头像 李华
网站建设 2026/4/19 23:33:23

2026 年企业数字化转型必备!智慧人力系统核心功能与应用场景解析

在企业数字化转型的进程中&#xff0c;人力资源管理的数字化升级成为关键环节&#xff0c;智慧人力系统则是实现这一升级的核心载体。不少企业在转型中面临人事流程割裂、数据利用低效、管理决策缺乏依据的问题&#xff0c;而智慧人力系统通过整合技术与人力管理业务&#xff0…

作者头像 李华
网站建设 2026/4/16 13:13:37

Java毕设项目推荐-基于springboot的慢性病健康管理系统的设计与实现基于大数据的慢性病健康管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 9:56:21

【日记】这炒河粉好辣!怎么还能放山海椒的啊…… 不过好好吃(1703 字)

正文 终于凑到了同事跟朋友在一块儿健身了。本来想让他们俩相互认识认识&#xff0c;特喵的俩人还是叫我推微信。我真绷不住了。 有那么社恐吗&#xff0c;这话都不聊两句的…… 明明他马上就要到总行去打黑工了。不过该说不说&#xff0c;这运气也是没谁了。全国就那么几个人&…

作者头像 李华
网站建设 2026/4/23 9:56:29

基于Springboot智能停车计费管理系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华