雾特效

转载于 https://blog.csdn.net/luoyun620/article/details/107494145

                //计算每个渲染顶点和视点(相机)的距离
                //"//计算雾化距离(当它远离眼睛位置时,系数变小)\n" +
                var fragmentShaderSource =
                "float getDistance(sampler2D depthTexture, vec2 texCoords) \n" +
                "{ \n" +
                "    float depth = czm_unpackDepth(texture2D(depthTexture, texCoords)); \n" +
                "    if (depth == 0.0) { \n" +
                "        return czm_infinity; \n" +
                "    } \n" +
                "    vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth); \n" +
                "    return -eyeCoordinate.z / eyeCoordinate.w; \n" +
                "} \n" +

                "float interpolateByDistance(vec4 nearFarScalar, float distance) \n" +
                "{ \n" +
                "    float startDistance = nearFarScalar.x;//雾化的起点距离 \n" +
                "    float startValue = nearFarScalar.y; \n" +
                "    float endDistance = nearFarScalar.z; \n" +
                "    float endValue = nearFarScalar.w; \n" +
                "    float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); \n" +
                "    return mix(startValue,endValue,t ); \n" +
                "} \n" +
                "vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) \n" +
                "{ \n" +
                "    return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); \n" +
                "} \n" +
                "uniform sampler2D colorTexture; \n" +
                "uniform sampler2D depthTexture; \n" +
                "uniform vec4 fogByDistance; \n" +
                "uniform vec4 fogColor; //雾的颜色\n" +
                "varying vec2 v_textureCoordinates; \n" +
                "void main(void) \n" +
                "{ \n" +
                "    float distance = getDistance(depthTexture, v_textureCoordinates); \n" +
                "    vec4 sceneColor = texture2D(colorTexture, v_textureCoordinates); \n" +
                "    float blendAmount = interpolateByDistance(fogByDistance, distance); \n" +
                "    vec4 finalFogColor = vec4(fogColor.rgb, fogColor.a * blendAmount); \n" +
                "    gl_FragColor = alphaBlend(finalFogColor, sceneColor); \n" +
                "} \n";
                function addFog () {
                    var postProcessStage = viewer.scene.postProcessStages.add(
                        new Cesium.PostProcessStage({
                            fragmentShader: fragmentShaderSource,
                            uniforms: {
                                fogByDistance: new Cesium.Cartesian4(0.0, 0.0, 15000, 1.0),
                                fogColor: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
                            },
                        })
                    );
                }
                addFog();

你可能感兴趣的:(雾特效)