shader之渐变长方体实现(cesium)
前置内容博客:
shader之cesium应用(https://www.cnblogs.com/s313139232/p/14316829.html)
shader之渐变长方体实现(threejs)(https://www.cnblogs.com/s313139232/p/14316836.html)
效果:
原理:
1.position获取:
1.1 在cesium中,可通过vec4 p = czm_computePosition();获取 模型座标中相对于眼睛的位置矩阵
1.2 vec4 eyePosition = czm_modelViewRelativeToEye * p; // position in eye coordinates 获取eyePosition
1.3 v_positionEC = czm_inverseModelView * eyePosition; // 将eyePosition转换为模型座标 注意:模型座标系的原点为地心,不等于模型的东北上座标系
2.法线获取:
float cy = fract((abs(l - 50000.0))/100000.0);
float cy = fract((abs(l - 100000.0))/200000.0);
完成着色器代码:
vertexShaderSource: ` attribute vec3 position3DHigh; attribute vec3 position3DLow; attribute vec3 normal; attribute vec2 st; attribute float batchId; varying vec4 v_positionEC; varying vec3 v_normalEC; varying vec2 v_st; void main() { vec4 p = czm_computePosition(); vec4 eyePosition = czm_modelViewRelativeToEye * p; v_positionEC = czm_inverseModelView * eyePosition; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates v_st = st; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `, fragmentShaderSource: ` varying vec4 v_positionEC; varying vec3 v_normalEC; void main() { float l = sqrt(pow(v_positionEC.x,2.0) + pow(v_positionEC.y,2.0) + pow(v_positionEC.z,2.0)); float cy = fract((abs(l - 100000.0))/200000.0); gl_FragColor = vec4(0.0, 0.0, cy, 1.0); } `,
合作:@浩
钻研不易,转载请注明出处。。。。。。