shader之漸變長方體實現(cesium)

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); 
  3.4應用漸變的一部分:
    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);
                        }
                `,

 

 

 

合作:@浩

鑽研不易,轉載請註明出處。。。。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章