mirror of
https://github.com/overte-org/overte.git
synced 2025-04-16 13:56:24 +02:00
Fixed shaders for GLSL 4.1
This commit is contained in:
parent
69ace03919
commit
aa64e51281
3 changed files with 49 additions and 109 deletions
|
@ -285,20 +285,15 @@ float getZEyeAtUV(vec2 texCoord, int level) {
|
|||
return -textureLod(depthPyramidTex, texCoord, level).x;
|
||||
}
|
||||
|
||||
float getZEyeAtUV(vec2 texCoord, int level, ivec2 texelOffset) {
|
||||
return -textureLodOffset(depthPyramidTex, texCoord, level, texelOffset).x;
|
||||
}
|
||||
<@func getZEyeAtUVOffset(texCoord, level, texelOffset)@>
|
||||
-textureLodOffset(depthPyramidTex, <$texCoord$>, <$level$>, <$texelOffset$>).x;
|
||||
<@endfunc@>
|
||||
|
||||
float getZEyeAtUV(ivec4 side, vec2 texCoord, int level) {
|
||||
texCoord.x = mix(texCoord.x, (texCoord.x + getStereoSide(side)) * 0.5, isStereo());
|
||||
return getZEyeAtUV(texCoord, level);
|
||||
}
|
||||
|
||||
float getZEyeAtUV(ivec4 side, vec2 texCoord, int level, ivec2 texelOffset) {
|
||||
texCoord.x = mix(texCoord.x, (texCoord.x + getStereoSide(side)) * 0.5, isStereo());
|
||||
return getZEyeAtUV(texCoord, level, texelOffset);
|
||||
}
|
||||
|
||||
vec3 packNormal(vec3 normal) {
|
||||
vec3 absNormal = abs(normal);
|
||||
return 0.5 + normal * 0.5 / max(absNormal.x, max(absNormal.y, absNormal.z));
|
||||
|
@ -335,7 +330,7 @@ vec2 fetchTap(ivec4 side, vec2 tapUV, float tapRadius) {
|
|||
int mipLevel = evalMipFromRadius(tapRadius * float(doFetchMips()));
|
||||
|
||||
vec2 fetchUV = clamp(tapUV, vec2(0), vec2(1));
|
||||
fetchUV = mix(fetchUV, vec2((fetchUV.x + getStereoSide(side)) * 0.5, fetchUV.y), isStereo());
|
||||
fetchUV = isStereo() ? vec2((fetchUV.x + getStereoSide(side)) * 0.5, fetchUV.y) : fetchUV;
|
||||
|
||||
vec2 P;
|
||||
P.x = float(mipLevel);
|
||||
|
@ -348,10 +343,12 @@ vec3 buildPosition(ivec4 side, vec2 fragUVPos) {
|
|||
return evalEyePositionFromZeye(side.x, Zeye, fragUVPos);
|
||||
}
|
||||
|
||||
vec3 buildPosition(ivec4 side, vec2 fragUVPos, ivec2 texelOffset, vec2 deltaUV) {
|
||||
float Zeye = getZEyeAtUV(side, fragUVPos, 0, texelOffset);
|
||||
return evalEyePositionFromZeye(side.x, Zeye, fragUVPos + texelOffset*deltaUV);
|
||||
<@func buildPositionOffset(side, fragUVPos, sideFragUVPos, texelOffset, deltaUV, position)@>
|
||||
{
|
||||
float Zeye = <$getZEyeAtUVOffset($sideFragUVPos$, 0, $texelOffset$)$>
|
||||
<$position$> = evalEyePositionFromZeye(<$side$>.x, Zeye, <$fragUVPos$> + <$texelOffset$>*<$deltaUV$>);
|
||||
}
|
||||
<@endfunc@>
|
||||
|
||||
vec3 getMinDelta(vec3 centralPoint, vec3 offsetPointPos, vec3 offsetPointNeg) {
|
||||
vec3 delta0 = offsetPointPos - centralPoint;
|
||||
|
@ -362,11 +359,25 @@ vec3 getMinDelta(vec3 centralPoint, vec3 offsetPointPos, vec3 offsetPointNeg) {
|
|||
return sqrLength0 < sqrLength1 ? delta0 : delta1;
|
||||
}
|
||||
|
||||
const ivec2 UV_RIGHT = ivec2(1,0);
|
||||
const ivec2 UV_LEFT = ivec2(-1,0);
|
||||
const ivec2 UV_TOP = ivec2(0,1);
|
||||
const ivec2 UV_BOTTOM = ivec2(0,-1);
|
||||
|
||||
vec3 buildNormal(ivec4 side, vec2 fragUVPos, vec3 fragPosition, vec2 deltaDepthUV) {
|
||||
vec3 fragPositionDxPos = buildPosition(side, fragUVPos, ivec2(1,0), deltaDepthUV);
|
||||
vec3 fragPositionDxNeg = buildPosition(side, fragUVPos, ivec2(-1,0), deltaDepthUV);
|
||||
vec3 fragPositionDyPos = buildPosition(side, fragUVPos, ivec2(0,1), deltaDepthUV);
|
||||
vec3 fragPositionDyNeg = buildPosition(side, fragUVPos, ivec2(0,-1), deltaDepthUV);
|
||||
vec2 sideUVPos = fragUVPos;
|
||||
|
||||
sideUVPos.x = mix(sideUVPos.x, (sideUVPos.x + getStereoSide(side)) * 0.5, isStereo());
|
||||
|
||||
vec3 fragPositionDxPos;
|
||||
vec3 fragPositionDxNeg;
|
||||
vec3 fragPositionDyPos;
|
||||
vec3 fragPositionDyNeg;
|
||||
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_RIGHT, deltaDepthUV, fragPositionDxPos)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_LEFT, deltaDepthUV, fragPositionDxNeg)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_TOP, deltaDepthUV, fragPositionDyPos)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_BOTTOM, deltaDepthUV, fragPositionDyNeg)$>
|
||||
|
||||
vec3 fragDeltaDx = getMinDelta(fragPosition, fragPositionDxPos, fragPositionDxNeg);
|
||||
vec3 fragDeltaDy = getMinDelta(fragPosition, fragPositionDyPos, fragPositionDyNeg);
|
||||
|
@ -376,10 +387,19 @@ vec3 buildNormal(ivec4 side, vec2 fragUVPos, vec3 fragPosition, vec2 deltaDepthU
|
|||
|
||||
void buildTangentBinormal(ivec4 side, vec2 fragUVPos, vec3 fragPosition, vec3 fragNormal, vec2 deltaDepthUV,
|
||||
out vec3 fragTangent, out vec3 fragBinormal) {
|
||||
vec3 fragPositionDxPos = buildPosition(side, fragUVPos, ivec2(1,0), deltaDepthUV);
|
||||
vec3 fragPositionDxNeg = buildPosition(side, fragUVPos, ivec2(-1,0), deltaDepthUV);
|
||||
vec3 fragPositionDyPos = buildPosition(side, fragUVPos, ivec2(0,1), deltaDepthUV);
|
||||
vec3 fragPositionDyNeg = buildPosition(side, fragUVPos, ivec2(0,-1), deltaDepthUV);
|
||||
vec2 sideUVPos = fragUVPos;
|
||||
|
||||
sideUVPos.x = mix(sideUVPos.x, (sideUVPos.x + getStereoSide(side)) * 0.5, isStereo());
|
||||
|
||||
vec3 fragPositionDxPos;
|
||||
vec3 fragPositionDxNeg;
|
||||
vec3 fragPositionDyPos;
|
||||
vec3 fragPositionDyNeg;
|
||||
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_RIGHT, deltaDepthUV, fragPositionDxPos)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_LEFT, deltaDepthUV, fragPositionDxNeg)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_TOP, deltaDepthUV, fragPositionDyPos)$>
|
||||
<$buildPositionOffset(side, fragUVPos, sideUVPos, UV_BOTTOM, deltaDepthUV, fragPositionDyNeg)$>
|
||||
|
||||
vec3 fragDeltaDx = getMinDelta(fragPosition, fragPositionDxPos, fragPositionDxNeg);
|
||||
vec3 fragDeltaDy = getMinDelta(fragPosition, fragPositionDyPos, fragPositionDyNeg);
|
||||
|
|
|
@ -37,96 +37,15 @@ vec2 getDebugCursorTexcoord(){
|
|||
layout(location=0) out vec4 outFragColor;
|
||||
|
||||
void main(void) {
|
||||
vec2 imageSize = getStereoSideSize(getResolutionLevel());
|
||||
|
||||
// In debug adjust the correct frag pixel based on base resolution
|
||||
vec2 fragCoord = gl_FragCoord.xy;
|
||||
if (getResolutionLevel() > 0) {
|
||||
fragCoord /= float (1 << getResolutionLevel());
|
||||
}
|
||||
|
||||
// Stereo side info based on the real viewport size of this pass
|
||||
vec2 sideDepthSize = getDepthTextureSideSize(0);
|
||||
// Pixel Debugged
|
||||
vec2 cursorUV = getDebugCursorTexcoord();
|
||||
vec2 cursorPixelPos = cursorUV * imageSize;
|
||||
vec2 cursorPixelPos = cursorUV * sideDepthSize;
|
||||
|
||||
ivec2 ssC = ivec2(cursorPixelPos);
|
||||
|
||||
// Fetch the z under the pixel (stereo or not)
|
||||
float Zeye = getZEyeAtPixel(ssC, 0);
|
||||
ivec2 fragUVPos = ivec2(cursorPixelPos);
|
||||
|
||||
// Stereo side info
|
||||
ivec4 side = getStereoSideInfo(ssC.x, getResolutionLevel());
|
||||
// TODO
|
||||
|
||||
// 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);
|
||||
|
||||
vec2 fragToCursor = cursorPixelPos - fragCoord.xy;
|
||||
if (dot(fragToCursor,fragToCursor) > ssDiskRadius * ssDiskRadius) {
|
||||
discard;
|
||||
}
|
||||
|
||||
// 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;
|
||||
float keepTapRadius = 1.0;
|
||||
int keptMip = -1;
|
||||
bool keep = false;
|
||||
int sampleCount = int(getNumSamples());
|
||||
for (int i = 0; i < sampleCount; ++i) {
|
||||
vec3 tap = getTapLocationClampedSSAO(i, randomPatternRotationAngle, ssDiskRadius, cursorPixelPos, imageSize);
|
||||
|
||||
// The occluding point in camera space
|
||||
vec2 fragToTap = vec2(ssC) + tap.xy - fragCoord.xy;
|
||||
if (dot(fragToTap,fragToTap) < keepTapRadius) {
|
||||
keep = true;
|
||||
keptMip = evalMipFromRadius(tap.z * float(doFetchMips()));
|
||||
}
|
||||
|
||||
vec3 tapUVZ = fetchTap(side, ssC, tap, imageSize);
|
||||
|
||||
vec3 Q = evalEyePositionFromZeye(side.x, tapUVZ.z, tapUVZ.xy);
|
||||
|
||||
sum += float(tap.z > 0.0) * evalVisibilitySSAO(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 = packOcclusionOutput(A, Cp.z, vec3(0,0,1));
|
||||
|
||||
if ((dot(fragToCursor,fragToCursor) < (100.0 * keepTapRadius * keepTapRadius) )) {
|
||||
// outFragColor = vec4(vec3(A), 1.0);
|
||||
outFragColor = vec4(vec3(A), 1.0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!keep) {
|
||||
outFragColor = vec4(0.1);
|
||||
} else {
|
||||
outFragColor.rgb = colorWheel(float(keptMip)/float(MAX_MIP_LEVEL));
|
||||
}
|
||||
outFragColor = packOcclusionOutput(0.0, 0.0, vec3(0.0, 0.0, 1.0));
|
||||
}
|
||||
|
|
|
@ -15,8 +15,9 @@
|
|||
|
||||
LAYOUT(binding=GPU_TEXTURE_MIP_CREATION_INPUT) uniform sampler2D depthTexture;
|
||||
|
||||
in vec2 varTexCoord0;
|
||||
out vec4 outFragColor;
|
||||
layout(location=0) in vec2 varTexCoord0;
|
||||
|
||||
layout(location=0) out vec4 outFragColor;
|
||||
|
||||
void main(void) {
|
||||
vec4 depths = textureGather(depthTexture, varTexCoord0);
|
||||
|
|
Loading…
Reference in a new issue