mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 15:08:05 +02:00
86 lines
2.7 KiB
Text
86 lines
2.7 KiB
Text
<@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);
|
|
}*/
|
|
|
|
}
|