Cesium自定义模型和着色器
自定义模型
要让WebGL渲染出一个正确的模型,通常需要提供以下信息:
- 顶点: 定义模型的各个顶点
- 顶点颜色: 定义每个顶点的颜色(顶点颜色会在传入片元着色器之前进行插值,如果片元颜色使用的是从顶点着色器中传入的顶点颜色,则最终会呈现一种渐变效果)
- 法线: 定义每个顶点的法线方向
- 顶点索引: 定义顶点的连接顺序(哪些点连成一个三角形)
- UV: 定义每个顶点的颜色应该从贴图上的哪个位置获取(UV坐标也会在传入片元着色器之前进行插值,从而在片元着色器中通过UV坐标查询贴图,获取对应的颜色)
- 贴图: 模型的纹理
创建一个Geometry
在Cesium中定义自己的模型最重要的是实例化一个Geometry对象。
定义一个Geometry所需的各种属性通常采用读取模型或者公式计算的方式获得,这里为了方便演示,采用直接定义的方法。
1 |
|
创建一个GeometryInstance
GeometryInstance可用于存放并统一管理多个Geometry,如:
- 乘以同一个矩阵: 设置modelMatrix
- 赋予相同的attributes属性: 如赋予相同颜色 attributes : { color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)}
而它最重要的作用是合并图形减少DrawCall,提高渲染效率。
1 |
|
创建Appearance
Appearance定义了primitive应该如何进行着色,后面会提到如何自定义着色器。
这里简单创建一个MaterialAppearance。
1 |
|
创建Primitive
1 |
|
最终创建出来的效果如下:
定义着色器
前面提到Appearance定义了primitive应该如何进行着色。
Cesium的Appearance只是一个抽象类,可以通过继承它实现自己的Appearance类,也可以使用Cesium定义好的其他Appearance类。
- MaterialAppearance
- EllipsoidSurfaceAppearance
- PerInstanceColorAppearance
- DebugAppearance
- PolylineColorAppearance
- PolylineMaterialAppearance
它们大致都可以通过以下两种方式自定义着色器。
这里以MaterialAppearance为例。
两种方式中定义顶点着色器的方式都是通过传入vertexShaderSource字段,区别在于自定义的片元着色器代码写在什么地方。
第一种方式:直接在fragmentShaderSource中写
1 |
|
第二种方式:创建Material对象
1 |
|
两段着色器的渲染效果都一致:挖空中间一段。
动起来
前面创建的着色器都是静止的,如果我们想做出流动的效果,建议采用上面的第二种自定义方式。
将会改变的参数作为uniform传入着色器,并在手动为uniform进行更新。
1 |
|
流动效果
Cesium自定义模型和着色器
https://www.liaomz.top/2022/02/25/cesium-zi-ding-yi-mo-xing-he-zhao-se-qi/