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);
                        }
                `,

 

 

 

合作:@浩

钻研不易,转载请注明出处。。。。。。

 

posted @ 2021-01-23 14:17  莫小龙  阅读(2857)  评论(1编辑  收藏  举报