Skip to content
Cesium高度雾

实现

C++
uniform sampler2D colorTexture;

    uniform sampler2D depthTexture;

    in vec2 v_textureCoordinates;

  

    uniform float earthRadius;

    uniform vec4 fogByHeight;

    uniform vec4 fogColor;  

    float interpolateByDistance(vec4 nearFarScalar, float distance)

    {

      float startDistance = nearFarScalar.x;

      float startValue = nearFarScalar.y;

      float endDistance = nearFarScalar.z;

      float endValue = nearFarScalar.w;

      float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0);

      return mix(startValue, endValue, t);

    }

    vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor)

    {

      return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a);

    }

    void main(){

        out_FragColor = texture(colorTexture, v_textureCoordinates);

        float depth =czm_unpackDepth(texture(depthTexture, v_textureCoordinates));

        if(depth>=1.)return;

        vec4 eyeCoordinate4 = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth);

        vec3 eyeCoordinate3 = eyeCoordinate4.xyz/eyeCoordinate4.w;

        vec4 worldCoordinate4 = czm_inverseView * vec4(eyeCoordinate3,1.) ;  

        vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w;

        float altitude = length(worldCoordinate.xyz) - earthRadius; //当前高度

        vec4 sceneColor = texture(colorTexture, v_textureCoordinates);

        float blendAmount = interpolateByDistance(fogByHeight, altitude);

        vec4 finalFogColor = vec4(fogColor.rgb, fogColor.a * blendAmount);

        out_FragColor = alphaBlend(finalFogColor, sceneColor);

      }

Updated at: