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); } `,
合作:@浩
鑽研不易,轉載請註明出處。。。。。。