123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #extension GL_EXT_frag_depth : enable
- uniform sampler2D u_pointCloud_colorGBuffer;
- uniform sampler2D u_pointCloud_depthGBuffer;
- uniform vec2 u_distanceAndEdlStrength;
- varying vec2 v_textureCoordinates;
- vec2 neighborContribution(float log2Depth, vec2 offset)
- {
- float dist = u_distanceAndEdlStrength.x;
- vec2 texCoordOrig = v_textureCoordinates + offset * dist;
- vec2 texCoord0 = v_textureCoordinates + offset * floor(dist);
- vec2 texCoord1 = v_textureCoordinates + offset * ceil(dist);
- float depthOrLogDepth0 = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, texCoord0));
- float depthOrLogDepth1 = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, texCoord1));
- // ignore depth values that are the clear depth
- if (depthOrLogDepth0 == 0.0 || depthOrLogDepth1 == 0.0) {
- return vec2(0.0);
- }
- // interpolate the two adjacent depth values
- float depthMix = mix(depthOrLogDepth0, depthOrLogDepth1, fract(dist));
- vec4 eyeCoordinate = czm_windowToEyeCoordinates(texCoordOrig, depthMix);
- return vec2(max(0.0, log2Depth - log2(-eyeCoordinate.z / eyeCoordinate.w)), 1.0);
- }
- void main()
- {
- float depthOrLogDepth = czm_unpackDepth(texture2D(u_pointCloud_depthGBuffer, v_textureCoordinates));
- vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depthOrLogDepth);
- eyeCoordinate /= eyeCoordinate.w;
- float log2Depth = log2(-eyeCoordinate.z);
- if (depthOrLogDepth == 0.0) // 0.0 is the clear value for the gbuffer
- {
- discard;
- }
- vec4 color = texture2D(u_pointCloud_colorGBuffer, v_textureCoordinates);
- // sample from neighbors left, right, down, up
- vec2 texelSize = 1.0 / czm_viewport.zw;
- vec2 responseAndCount = vec2(0.0);
- responseAndCount += neighborContribution(log2Depth, vec2(-texelSize.x, 0.0));
- responseAndCount += neighborContribution(log2Depth, vec2(+texelSize.x, 0.0));
- responseAndCount += neighborContribution(log2Depth, vec2(0.0, -texelSize.y));
- responseAndCount += neighborContribution(log2Depth, vec2(0.0, +texelSize.y));
- float response = responseAndCount.x / responseAndCount.y;
- float strength = u_distanceAndEdlStrength.y;
- float shade = exp(-response * 300.0 * strength);
- color.rgb *= shade;
- gl_FragColor = vec4(color);
- #ifdef LOG_DEPTH
- czm_writeLogDepth(1.0 + (czm_projection * vec4(eyeCoordinate.xyz, 1.0)).w);
- #else
- gl_FragDepthEXT = czm_eyeToWindowCoordinates(vec4(eyeCoordinate.xyz, 1.0)).z;
- #endif
- }
|