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.法線獲取:
v_normalEC = czm_normal * normal; // normal in eye coordinates 獲取eyeNormal
3.片元着色器計算:
3.1由於獲取道德是模型坐標,並不是東北上坐標,所以不能直接使用坐標y值表示模型高度。
3.2模型高度計算: 通過矢量長度計算公式算出點模型坐標內點到地心原點的距離
float l = sqrt(pow(v_positionEC.x,2.0) + pow(v_positionEC.y,2.0) + pow(v_positionEC.z,2.0));
3.3拉伸后取小數部分得到0到1的漸變值。矩形高:100000
float cy = fract((abs(l - 50000.0))/100000.0);
float cy = fract((abs(l - 50000.0))/100000.0);
3.4應用漸變的一部分:
float cy = fract((abs(l - 100000.0))/200000.0);
float cy = fract((abs(l - 100000.0))/200000.0);
得到最終效果:
gl_FragColor = vec4(0.0, 0.0, cy3, 1.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); } `,
合作:@浩
鑽研不易,轉載請注明出處。。。。。。