| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | #ifdef GL_EXT_frag_depth#extension GL_EXT_frag_depth : enable#endif#ifdef TEXTURE_COORDINATES#ifdef SPHERICALvarying vec4 v_sphericalExtents;#else // SPHERICALvarying vec2 v_inversePlaneExtents;varying vec4 v_westPlane;varying vec4 v_southPlane;#endif // SPHERICALvarying vec3 v_uvMinAndSphericalLongitudeRotation;varying vec3 v_uMaxAndInverseDistance;varying vec3 v_vMaxAndInverseDistance;#endif // TEXTURE_COORDINATES#ifdef PER_INSTANCE_COLORvarying vec4 v_color;#endif#ifdef NORMAL_ECvec3 getEyeCoordinate3FromWindowCoordinate(vec2 fragCoord, float logDepthOrDepth) {    vec4 eyeCoordinate = czm_windowToEyeCoordinates(fragCoord, logDepthOrDepth);    return eyeCoordinate.xyz / eyeCoordinate.w;}vec3 vectorFromOffset(vec4 eyeCoordinate, vec2 positiveOffset) {    vec2 glFragCoordXY = gl_FragCoord.xy;    // Sample depths at both offset and negative offset    float upOrRightLogDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, (glFragCoordXY + positiveOffset) / czm_viewport.zw));    float downOrLeftLogDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, (glFragCoordXY - positiveOffset) / czm_viewport.zw));    // Explicitly evaluate both paths    // Necessary for multifrustum and for edges of the screen    bvec2 upOrRightInBounds = lessThan(glFragCoordXY + positiveOffset, czm_viewport.zw);    float useUpOrRight = float(upOrRightLogDepth > 0.0 && upOrRightInBounds.x && upOrRightInBounds.y);    float useDownOrLeft = float(useUpOrRight == 0.0);    vec3 upOrRightEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY + positiveOffset, upOrRightLogDepth);    vec3 downOrLeftEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY - positiveOffset, downOrLeftLogDepth);    return (upOrRightEC - (eyeCoordinate.xyz / eyeCoordinate.w)) * useUpOrRight + ((eyeCoordinate.xyz / eyeCoordinate.w) - downOrLeftEC) * useDownOrLeft;}#endif // NORMAL_ECvoid main(void){#ifdef REQUIRES_EC    float logDepthOrDepth = czm_unpackDepth(texture2D(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw));    vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth);#endif#ifdef REQUIRES_WC    vec4 worldCoordinate4 = czm_inverseView * eyeCoordinate;    vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w;#endif#ifdef TEXTURE_COORDINATES    vec2 uv;#ifdef SPHERICAL    // Treat world coords as a sphere normal for spherical coordinates    vec2 sphericalLatLong = czm_approximateSphericalCoordinates(worldCoordinate);    sphericalLatLong.y += v_uvMinAndSphericalLongitudeRotation.z;    sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi);    uv.x = (sphericalLatLong.y - v_sphericalExtents.y) * v_sphericalExtents.w;    uv.y = (sphericalLatLong.x - v_sphericalExtents.x) * v_sphericalExtents.z;#else // SPHERICAL    // Unpack planes and transform to eye space    uv.x = czm_planeDistance(v_westPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.x;    uv.y = czm_planeDistance(v_southPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.y;#endif // SPHERICAL#endif // TEXTURE_COORDINATES#ifdef PICK#ifdef CULL_FRAGMENTS    // When classifying translucent geometry, logDepthOrDepth == 0.0    // indicates a region that should not be classified, possibly due to there    // being opaque pixels there in another buffer.    // Check for logDepthOrDepth != 0.0 to make sure this should be classified.    if (0.0 <= uv.x && uv.x <= 1.0 && 0.0 <= uv.y && uv.y <= 1.0 || logDepthOrDepth != 0.0) {        gl_FragColor.a = 1.0; // 0.0 alpha leads to discard from ShaderSource.createPickFragmentShaderSource        czm_writeDepthClamp();    }#else // CULL_FRAGMENTS        gl_FragColor.a = 1.0;#endif // CULL_FRAGMENTS#else // PICK#ifdef CULL_FRAGMENTS    // When classifying translucent geometry, logDepthOrDepth == 0.0    // indicates a region that should not be classified, possibly due to there    // being opaque pixels there in another buffer.    if (uv.x <= 0.0 || 1.0 <= uv.x || uv.y <= 0.0 || 1.0 <= uv.y || logDepthOrDepth == 0.0) {        discard;    }#endif#ifdef NORMAL_EC    // Compute normal by sampling adjacent pixels in 2x2 block in screen space    vec3 downUp = vectorFromOffset(eyeCoordinate, vec2(0.0, 1.0));    vec3 leftRight = vectorFromOffset(eyeCoordinate, vec2(1.0, 0.0));    vec3 normalEC = normalize(cross(leftRight, downUp));#endif#ifdef PER_INSTANCE_COLOR    vec4 color = czm_gammaCorrect(v_color);#ifdef FLAT    gl_FragColor = color;#else // FLAT    czm_materialInput materialInput;    materialInput.normalEC = normalEC;    materialInput.positionToEyeEC = -eyeCoordinate.xyz;    czm_material material = czm_getDefaultMaterial(materialInput);    material.diffuse = color.rgb;    material.alpha = color.a;    gl_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC);#endif // FLAT    // Premultiply alpha. Required for classification primitives on translucent globe.    gl_FragColor.rgb *= gl_FragColor.a;#else // PER_INSTANCE_COLOR    // Material support.    // USES_ is distinct from REQUIRES_, because some things are dependencies of each other or    // dependencies for culling but might not actually be used by the material.    czm_materialInput materialInput;#ifdef USES_NORMAL_EC    materialInput.normalEC = normalEC;#endif#ifdef USES_POSITION_TO_EYE_EC    materialInput.positionToEyeEC = -eyeCoordinate.xyz;#endif#ifdef USES_TANGENT_TO_EYE    materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(worldCoordinate, normalEC);#endif#ifdef USES_ST    // Remap texture coordinates from computed (approximately aligned with cartographic space) to the desired    // texture coordinate system, which typically forms a tight oriented bounding box around the geometry.    // Shader is provided a set of reference points for remapping.    materialInput.st.x = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_uMaxAndInverseDistance.xy, uv) * v_uMaxAndInverseDistance.z;    materialInput.st.y = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_vMaxAndInverseDistance.xy, uv) * v_vMaxAndInverseDistance.z;#endif    czm_material material = czm_getMaterial(materialInput);#ifdef FLAT    gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);#else // FLAT    gl_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC);#endif // FLAT    // Premultiply alpha. Required for classification primitives on translucent globe.    gl_FragColor.rgb *= gl_FragColor.a;#endif // PER_INSTANCE_COLOR    czm_writeDepthClamp();#endif // PICK}
 |