<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // // Created by Sam Gateau on 1/1/16. // Copyright 2016 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include ssao.slh@> <$declareAmbientOcclusion()$> <$declareFetchDepthPyramidMap()$> <$declareSamplingDisk()$> <$declareEvalObscurance()$> <$declarePackOcclusionDepth()$> out vec4 outFragColor; void main(void) { vec2 imageSize = getSideImageSize(getResolutionLevel()); // Pixel being shaded vec2 fragCoord = gl_FragCoord.xy; ivec2 ssC = ivec2(fragCoord.xy); // Fetch the z under the pixel (stereo or not) float Zeye = getZEye(ssC, 0); // Stereo side info ivec4 side = getStereoSideInfo(ssC.x, getResolutionLevel()); // From now on, ssC is the pixel pos in the side ssC.x -= side.y; vec2 fragPos = (vec2(ssC) + vec2(0.5)) / imageSize; // The position and normal of the pixel fragment in Eye space vec3 Cp = evalEyePositionFromZeye(side.x, Zeye, fragPos); vec3 Cn = evalEyeNormal(Cp); // Choose the screen-space sample radius float ssDiskRadius = evalDiskRadius(Cp.z, imageSize); // Let's make noise float randomPatternRotationAngle = getAngleDithering(ssC); //vec3 wCp = (getViewInverse() * vec4(Cp, 1.0)).xyz; //float randomPatternRotationAngle = getAngleDitheringWorldPos(wCp); // Accumulate the Obscurance for each samples float sum = 0.0; for (int i = 0; i < getNumSamples(); ++i) { vec3 tap = getTapLocationClamped(i, randomPatternRotationAngle, ssDiskRadius, ssC, imageSize); vec3 tapUVZ = fetchTap(side, ssC, tap, imageSize); vec3 Q = evalEyePositionFromZeye(side.x, tapUVZ.z, tapUVZ.xy); sum += float(tap.z > 0.0) * evalAO(Cp, Cn, Q); } float A = max(0.0, 1.0 - sum * getObscuranceScaling() * 5.0 * getInvNumSamples()); // KEEP IT for Debugging // Bilateral box-filter over a quad for free, respecting depth edges // (the difference that this makes is subtle) if (abs(dFdx(Cp.z)) < 0.02) { A -= dFdx(A) * ((ssC.x & 1) - 0.5); } if (abs(dFdy(Cp.z)) < 0.02) { A -= dFdy(A) * ((ssC.y & 1) - 0.5); } outFragColor = vec4(packOcclusionDepth(A, CSZToDephtKey(Cp.z)), 1.0); /* { vec3 tap = getTapLocationClamped(2, randomPatternRotationAngle, ssDiskRadius, ssC, imageSize); vec3 tapUVZ = fetchTap(side, ssC, tap, imageSize); vec2 fetchUV = vec2(tapUVZ.x + side.w * 0.5 * (side.x - tapUVZ.x), tapUVZ.y); vec3 Q = evalEyePositionFromZeye(side.x, tapUVZ.z, tapUVZ.xy); outFragColor = vec4(fetchUV, 0.0, 1.0); }*/ }