使用Cesium,避免不了会和WebGL打交道。而Cesium中很多特殊材质、后处理效果,都需要我们直接编写GLSL(OpenGL Shading language)来进行着色器编程。WebGL本身已经很难理解了,而Cesium也内置了很多变量和函数,用于glsl编程。
看了一些大佬的文章和示例,Cesium内置的用于glsl编程的函数和变量,大多是czm_前缀的。可是借鉴和自学起来很泪奔···因为相关的介绍非常少(可能是因为Cesium后续版本中要弱化czm的东西,所以官网介绍都去掉了[个人猜测,可能不对。也可能是我能力有限,确实没找到叫全面的介绍资料])。而三维运算中又涉及大量的矩阵、向量的运算。而WebGL中,大部分也需要进行归一化运算。整体看起来很抽象。
我个人也是在运用Cesium的glsl处理特效方面遇到了障碍,因此下决心收集和查找相关的资料。终于用科学的方式,收集到一些关于czm参数和方法的介绍。但因本人能力有限,收集到的还不是很全面,对于已收集的,也仅仅是介绍这些参数和方法的意思,具体如何使用,还需要后续不断深入研究。感谢理解。
一、常用的变量
1、czm_model:模型变换矩阵,将对象从模型空间变换到世界空间。
2、czm_view:视图变换矩阵,将世界空间中的对象变换到摄像机空间。
3、czm_projection:投影变换矩阵,将摄像机空间中的对象进行透视或正交投影,得到剪辑空间坐标。
4、czm_modelView:模型视图变换矩阵,即 czm_view * czm_model。
5、czm_modelViewProjection:模型视图投影变换矩阵,即 czm_projection * czm_view * czm_model,将对象从模型空间变换到剪辑空间。
6、czm_inverseModel:模型变换矩阵的逆矩阵,用于将世界空间中的坐标变换到模型空间中。
7、czm_inverseView:视图变换矩阵的逆矩阵,用于将摄像机空间中的坐标变换到世界空间中。
8、czm_inverseProjection:投影变换矩阵的逆矩阵,用于将剪辑空间中的坐标变换到摄像机空间中。
9、czm_normal:变换后的法线向量,用于进行光照计算。
10、czm_ellipsoid:椭球体参数,用于进行地球表面坐标系和笛卡尔坐标系之间的转换。
11、czm_frameNumber:帧计数器,每次渲染时自增1,可用于实现动画效果。
12、czm_pixelRatio:设备像素比,用于实现高分辨率屏幕上的渲染。
二、常用的函数
1、czm_unpackDepth:它用于将从深度纹理中读取到的深度值进行解压缩,以便在着色器中进行深度测试和深度值比较等操作。深度纹理通常用于实现阴影效果、深度检测等功能。在Cesium中,深度值通常被存储在一个16位的纹理单元中,这个值被压缩成0到1之间的浮点数,以便节省显存空间。
2、czm_inverseTranspose:返回一个矩阵的逆转置矩阵,通常用于变换法线向量。
3、czm_saturation:返回一个颜色的饱和度,通常用于实现色彩调整。
4、czm_sceneMode:返回当前场景的模式,例如二维地图、三维场景等。
5、czm_ellipsoidContainsPoint:判断一个点是否在当前椭球体内,通常用于进行鼠标拾取等操作。
6、czm_eastNorthUpToFixedFrame:返回从东-北-天坐标系到固定坐标系的变换矩阵,通常用于实现坐标系转换。
7、czm_geodeticSurfaceNormal:返回一个点在椭球体表面上的法线向量,通常用于进行光照计算。
8、czm_transformColor:将一个颜色从一种颜色空间转换为另一种颜色空间,通常用于进行色彩调整。
9、czm_decompressTextureCoordinates:解压缩纹理坐标,通常用于将纹理坐标从一个压缩格式转换为普通的二维坐标。
10、czm_eyeOffset:返回一个向量,表示摄像机视点在局部坐标系中的偏移量。
11、czm_fractionAndIntervalToIndex:根据插值系数和区间范围计算索引,通常用于实现纹理合并。