{"version":3,"file":"fragmentShader.mjs","sources":["../../../../../../../packages/components/analyses/src/viewshed/fragmentShader.ts"],"sourcesContent":["/*\n * @Author: zouyaoji@https://github.com/zouyaoji\n * @Date: 2022-01-08 11:05:10\n * @LastEditTime: 2022-01-10 11:48:44\n * @LastEditors: zouyaoji\n * @Description: refer to https://blog.csdn.net/fywindmoon/article/details/108415116\n * @FilePath: \\vue-cesium@next\\packages\\components\\analyses\\src\\viewshed\\fragmentShader.ts\n */\n/**\n * 可视域分析 shadowMap shader\n */\nexport default `\n#define USE_CUBE_MAP_SHADOW true\n uniform sampler2D colorTexture;\n uniform sampler2D depthTexture;\n varying vec2 v_textureCoordinates;\n uniform mat4 camera_projection_matrix;\n uniform mat4 camera_view_matrix;\n uniform samplerCube shadowMap_textureCube;\n uniform mat4 shadowMap_matrix;\n uniform vec4 shadowMap_lightPositionEC;\n uniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness;\n uniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth;\n uniform float vc_viewDistance;\n uniform vec4 vc_visibleAreaColor;\n uniform vec4 vc_invisibleAreaColor;\n struct zx_shadowParameters\n {\n     vec3 texCoords;\n     float depthBias;\n     float depth;\n     float nDotL;\n     vec2 texelStepSize;\n     float normalShadingSmooth;\n     float darkness;\n };\n float czm_shadowVisibility(samplerCube shadowMap, zx_shadowParameters shadowParameters)\n {\n     float depthBias = shadowParameters.depthBias;\n     float depth = shadowParameters.depth;\n     float nDotL = shadowParameters.nDotL;\n     float normalShadingSmooth = shadowParameters.normalShadingSmooth;\n     float darkness = shadowParameters.darkness;\n     vec3 uvw = shadowParameters.texCoords;\n     depth -= depthBias;\n     float visibility = czm_shadowDepthCompare(shadowMap, uvw, depth);\n     return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness);\n }\n vec4 getPositionEC(){\n     return czm_windowToEyeCoordinates(gl_FragCoord);\n }\n vec3 getNormalEC(){\n     return vec3(1.);\n }\n vec4 toEye(in vec2 uv,in float depth){\n     vec2 xy=vec2((uv.x*2.-1.),(uv.y*2.-1.));\n     vec4 posInCamera=czm_inverseProjection*vec4(xy,depth,1.);\n     posInCamera=posInCamera/posInCamera.w;\n     return posInCamera;\n }\n vec3 pointProjectOnPlane(in vec3 planeNormal,in vec3 planeOrigin,in vec3 point){\n     vec3 v01=point-planeOrigin;\n     float d=dot(planeNormal,v01);\n     return(point-planeNormal*d);\n }\n float getDepth(in vec4 depth){\n     float z_window=czm_unpackDepth(depth);\n     z_window=czm_reverseLogDepth(z_window);\n     float n_range=czm_depthRange.near;\n     float f_range=czm_depthRange.far;\n     return(2.*z_window-n_range-f_range)/(f_range-n_range);\n }\n float shadow(in vec4 positionEC){\n     vec3 normalEC=getNormalEC();\n     zx_shadowParameters shadowParameters;\n     shadowParameters.texelStepSize=shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy;\n     shadowParameters.depthBias=shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z;\n     shadowParameters.normalShadingSmooth=shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w;\n     shadowParameters.darkness=shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w;\n     vec3 directionEC=positionEC.xyz-shadowMap_lightPositionEC.xyz;\n     float distance=length(directionEC);\n     directionEC=normalize(directionEC);\n     float radius=shadowMap_lightPositionEC.w;\n     if(distance>radius)\n     {\n         return 2.0;\n     }\n     vec3 directionWC=czm_inverseViewRotation*directionEC;\n     shadowParameters.depth=distance/radius-0.0003;\n     shadowParameters.nDotL=clamp(dot(normalEC,-directionEC),0.,1.);\n     shadowParameters.texCoords=directionWC;\n     float visibility=czm_shadowVisibility(shadowMap_textureCube,shadowParameters);\n     return visibility;\n }\n bool visible(in vec4 result)\n {\n     result.x/=result.w;\n     result.y/=result.w;\n     result.z/=result.w;\n     return result.x>=-1.&&result.x<=1.\n     &&result.y>=-1.&&result.y<=1.\n     &&result.z>=-1.&&result.z<=1.;\n }\n void main(){\n     // 釉色 = 结构二维(颜色纹理, 纹理坐标)\n     gl_FragColor = texture2D(colorTexture, v_textureCoordinates);\n     // 深度 = 获取深度(结构二维(深度纹理, 纹理坐标))\n     float depth = getDepth(texture2D(depthTexture, v_textureCoordinates));\n     // 视角 = (纹理坐标, 深度)\n     vec4 viewPos = toEye(v_textureCoordinates, depth);\n     // 世界坐标\n     vec4 wordPos = czm_inverseView * viewPos;\n     // 虚拟相机中坐标\n     vec4 vcPos = camera_view_matrix * wordPos;\n     float near = .001 * vc_viewDistance;\n     float dis = length(vcPos.xyz);\n     if(dis > near && dis < vc_viewDistance){\n         // 透视投影\n         vec4 posInEye = camera_projection_matrix * vcPos;\n         // 可视区颜色\n         // vec4 vc_visibleAreaColor=vec4(0.,1.,0.,.5);\n         // vec4 vc_invisibleAreaColor=vec4(1.,0.,0.,.5);\n         if(visible(posInEye)){\n             float vis = shadow(viewPos);\n             if(vis > 0.3){\n                 gl_FragColor = mix(gl_FragColor,vc_visibleAreaColor,.5);\n             } else{\n                 gl_FragColor = mix(gl_FragColor,vc_invisibleAreaColor,.5);\n             }\n         }\n     }\n }\n`\n"],"names":[],"mappings":"AAAA,qBAAe,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;"}