mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 13:12:52 +02:00
Improved acnee issues
This commit is contained in:
parent
1ed0bd68b9
commit
6fcd63ed64
5 changed files with 52 additions and 26 deletions
|
@ -329,6 +329,8 @@ GLenum GLTexelFormat::evalGLTexelFormatInternal(const gpu::Element& dstFormat) {
|
|||
result = GL_RGBA8_SNORM;
|
||||
break;
|
||||
case gpu::NINT2_10_10_10:
|
||||
result = GL_RGB10_A2;
|
||||
break;
|
||||
case gpu::NUINT32:
|
||||
case gpu::NINT32:
|
||||
case gpu::COMPRESSED:
|
||||
|
@ -729,9 +731,9 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E
|
|||
texel.internalFormat = GL_DEPTH_COMPONENT24;
|
||||
break;
|
||||
}
|
||||
case gpu::NINT2_10_10_10:
|
||||
case gpu::COMPRESSED:
|
||||
case gpu::NUINT2:
|
||||
case gpu::NINT2_10_10_10:
|
||||
case gpu::NUM_TYPES: { // quiet compiler
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
|
@ -893,9 +895,12 @@ GLTexelFormat GLTexelFormat::evalGLTexelFormat(const Element& dstFormat, const E
|
|||
texel.format = GL_RGBA;
|
||||
texel.internalFormat = GL_RGBA2;
|
||||
break;
|
||||
case gpu::NINT2_10_10_10:
|
||||
texel.format = GL_RGBA;
|
||||
texel.internalFormat = GL_RGB10_A2;
|
||||
break;
|
||||
case gpu::NUINT32:
|
||||
case gpu::NINT32:
|
||||
case gpu::NINT2_10_10_10:
|
||||
case gpu::COMPRESSED:
|
||||
case gpu::NUM_TYPES: // quiet compiler
|
||||
Q_UNREACHABLE();
|
||||
|
|
|
@ -115,7 +115,7 @@ void AmbientOcclusionFramebuffer::allocate() {
|
|||
}
|
||||
auto width = sideSize.x;
|
||||
auto height = sideSize.y;
|
||||
auto format = gpu::Element::COLOR_RGBA_32;
|
||||
auto format = gpu::Element{ gpu::VEC4, gpu::NINT2_10_10_10, gpu::RGBA };
|
||||
_normalTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP,
|
||||
gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT, gpu::Sampler::WRAP_CLAMP));
|
||||
_normalFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("ssaoNormals"));
|
||||
|
@ -206,10 +206,10 @@ gpu::TexturePointer AmbientOcclusionFramebuffer::getNormalTexture() {
|
|||
|
||||
AmbientOcclusionEffectConfig::AmbientOcclusionEffectConfig() :
|
||||
render::GPUJobConfig::Persistent(QStringList() << "Render" << "Engine" << "Ambient Occlusion", false),
|
||||
radius{ 0.5f },
|
||||
radius{ 0.7f },
|
||||
perspectiveScale{ 1.0f },
|
||||
obscuranceLevel{ 0.25f },
|
||||
falloffAngle{ 0.4f },
|
||||
obscuranceLevel{ 0.15f },
|
||||
falloffAngle{ 0.1f },
|
||||
edgeSharpness{ 1.0f },
|
||||
blurDeviation{ 2.5f },
|
||||
numSpiralTurns{ 7.0f },
|
||||
|
|
|
@ -287,8 +287,17 @@ float getZEyeAtUV(ivec4 side, vec2 texCoord, int level, ivec2 texelOffset) {
|
|||
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));
|
||||
}
|
||||
|
||||
vec3 unpackNormal(vec3 packedNormal) {
|
||||
return normalize(packedNormal*2.0 - 1.0);
|
||||
}
|
||||
|
||||
vec3 getNormalEyeAtUV(vec2 texCoord, int level) {
|
||||
return normalize(textureLod(normalTex, texCoord, level).xyz*2.0 - vec3(1.0));
|
||||
return unpackNormal(textureLod(normalTex, texCoord, level).xyz);
|
||||
}
|
||||
|
||||
vec3 getNormalEyeAtUV(ivec4 side, vec2 texCoord, int level) {
|
||||
|
@ -297,7 +306,11 @@ vec3 getNormalEyeAtUV(ivec4 side, vec2 texCoord, int level) {
|
|||
}
|
||||
|
||||
vec3 getNormalEyeAtPixel(ivec2 pixel, int level) {
|
||||
return normalize(texelFetch(normalTex, pixel, level).xyz*2.0 - vec3(1.0));
|
||||
return unpackNormal(texelFetch(normalTex, pixel, level).xyz);
|
||||
}
|
||||
|
||||
vec2 snapToTexel(vec2 uv, vec2 pixelSize) {
|
||||
return (floor(uv * pixelSize - 0.5) + 0.5) / pixelSize;
|
||||
}
|
||||
|
||||
int evalMipFromRadius(float radius) {
|
||||
|
@ -418,12 +431,12 @@ float computeWeightedHorizon(float horizonLimit, float distanceSquared) {
|
|||
}
|
||||
|
||||
<@func computeHorizon()@>
|
||||
if (fragUVPos.x<0 || fragUVPos.y<0 || fragUVPos.x>=1.0 || fragUVPos.y>=1.0) {
|
||||
if (tapUVPos.x<0 || tapUVPos.y<0 || tapUVPos.x>=1.0 || tapUVPos.y>=1.0) {
|
||||
// Early exit because we've hit the borders of the frame
|
||||
break;
|
||||
}
|
||||
vec2 tapMipZ = fetchTap(side, fragUVPos, radius);
|
||||
vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapMipZ.y, fragUVPos);
|
||||
vec2 tapMipZ = fetchTap(side, tapUVPos, radius);
|
||||
vec3 tapPositionES = evalEyePositionFromZeye(side.x, tapMipZ.y, tapUVPos);
|
||||
vec3 deltaVec = tapPositionES - fragPositionES;
|
||||
float distanceSquared = dot(deltaVec, deltaVec);
|
||||
float deltaDotNormal = dot(deltaVec, fragFrameES.normal);
|
||||
|
@ -460,16 +473,18 @@ float computeWeightedHorizon(float horizonLimit, float distanceSquared) {
|
|||
#define HBAO_HORIZON_SEARCH_CONSTANT_STEP 0
|
||||
|
||||
float computeOcclusion(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, TBNFrame fragFrameES, vec2 searchDir, float searchRadius, int stepCount) {
|
||||
float occlusion = 0.0;
|
||||
#if HBAO_USE_COS_ANGLE
|
||||
float horizonLimit = getFalloffCosAngle();
|
||||
float occlusion = 0.0;
|
||||
#else
|
||||
float horizonLimit = getFalloffSinAngle();
|
||||
#endif
|
||||
|
||||
if (stepCount>0) {
|
||||
vec2 deltaTapUV = searchDir / float(stepCount);
|
||||
vec2 tapUVPos;
|
||||
float deltaRadius = searchRadius / float(stepCount);
|
||||
vec2 sideDepthSize = getDepthTextureSideSize(0);
|
||||
|
||||
#if HBAO_HORIZON_SEARCH_CONSTANT_STEP
|
||||
float radius = 0.0;
|
||||
|
@ -478,6 +493,7 @@ float computeOcclusion(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, TBNFrame
|
|||
for (stepIndex=0 ; stepIndex<stepCount ; stepIndex++) {
|
||||
fragUVPos += deltaTapUV;
|
||||
radius += deltaRadius;
|
||||
tapUVPos = snapToTexel(fragUVPos, sideDepthSize);
|
||||
|
||||
<$computeHorizon()$>
|
||||
}
|
||||
|
@ -488,6 +504,7 @@ float computeOcclusion(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, TBNFrame
|
|||
|
||||
while (radius<=searchRadius) {
|
||||
fragUVPos += deltaTapUV;
|
||||
tapUVPos = snapToTexel(fragUVPos, sideDepthSize);
|
||||
|
||||
<$computeHorizon()$>
|
||||
|
||||
|
@ -495,6 +512,7 @@ float computeOcclusion(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, TBNFrame
|
|||
mipLevel = tapMipZ.x;
|
||||
deltaRadius *= 2;
|
||||
deltaTapUV *= 2;
|
||||
sideDepthSize = getDepthTextureSideSize(int(mipLevel));
|
||||
}
|
||||
radius += deltaRadius;
|
||||
}
|
||||
|
@ -511,16 +529,27 @@ float computeOcclusion(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, TBNFrame
|
|||
}
|
||||
|
||||
float evalVisibilityHBAO(ivec4 side, vec2 fragUVPos, vec2 invSideImageSize, vec2 deltaTap, float diskPixelRadius,
|
||||
vec3 fragPositionES, TBNFrame fragFrameES) {
|
||||
vec3 fragPositionES, vec3 fragNormalES) {
|
||||
vec2 pixelSearchVec = deltaTap * diskPixelRadius;
|
||||
vec2 searchDir = pixelSearchVec * invSideImageSize;
|
||||
vec2 deltaTapUV = deltaTap * invSideImageSize;
|
||||
float obscuranceH1 = 0.0;
|
||||
float obscuranceH2 = 0.0;
|
||||
pixelSearchVec = abs(pixelSearchVec);
|
||||
int stepCount = int(ceil(max(pixelSearchVec.x, pixelSearchVec.y)));
|
||||
TBNFrame fragFrameES;
|
||||
|
||||
fragFrameES.tangent = vec3(0.0);
|
||||
fragFrameES.binormal = vec3(0.0);
|
||||
fragFrameES.normal = fragNormalES;
|
||||
|
||||
#if HBAO_USE_OVERHANG_HACK || !HBAO_USE_COS_ANGLE
|
||||
fragFrameES.tangent = normalize(fragFrameES.tangent * deltaTap.x + fragFrameES.binormal * deltaTap.y);
|
||||
vec3 positionPos = buildPosition(side, fragUVPos + deltaTapUV);
|
||||
vec3 positionNeg = buildPosition(side, fragUVPos - deltaTapUV);
|
||||
|
||||
fragFrameES.tangent = getMinDelta(fragPositionES, positionPos, positionNeg);
|
||||
fragFrameES.tangent -= dot(fragNormalES, fragFrameES.tangent) * fragNormalES;
|
||||
fragFrameES.tangent = normalize(fragFrameES.tangent);
|
||||
#endif
|
||||
// Forward search for h1
|
||||
obscuranceH1 = computeOcclusion(side, fragUVPos, fragPositionES, fragFrameES, searchDir, diskPixelRadius, stepCount);
|
||||
|
|
|
@ -37,8 +37,6 @@ void main(void) {
|
|||
// The position and normal of the pixel fragment in Eye space
|
||||
vec3 fragPositionES = buildPosition(side, fragUVPos);
|
||||
vec3 fragNormalES = buildNormal(side, fragUVPos, fragPositionES, deltaDepthUV);
|
||||
vec3 absFragNormalES = abs(fragNormalES);
|
||||
|
||||
fragNormalES /= max(absFragNormalES.z, max(absFragNormalES.x, absFragNormalES.y));
|
||||
outFragColor = vec4(vec3(fragNormalES)*0.5 + vec3(0.5), 1.0);
|
||||
outFragColor = vec4(packNormal(fragNormalES), 1.0);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,8 @@ void main(void) {
|
|||
// From now on, fragUVPos is the UV pos in the side
|
||||
fragUVPos.x = mix(fragUVPos.x, fragUVPos.x * 2.0 - getStereoSide(side), isStereo());
|
||||
|
||||
fragUVPos = snapToTexel(fragUVPos, sideDepthSize);
|
||||
|
||||
// The position and normal of the pixel fragment in Eye space
|
||||
vec2 deltaDepthUV = vec2(2.0) / sideDepthSize;
|
||||
vec3 fragPositionES = buildPosition(side, fragUVPos);
|
||||
|
@ -55,14 +57,6 @@ void main(void) {
|
|||
diskPixelRadius = min(diskPixelRadius, SSAO_HBAO_MAX_RADIUS);
|
||||
}
|
||||
|
||||
TBNFrame fragFrameES;
|
||||
|
||||
fragFrameES.tangent = vec3(0.0);
|
||||
fragFrameES.binormal = vec3(0.0);
|
||||
fragFrameES.normal = fragNormalES;
|
||||
#if HBAO_USE_OVERHANG_HACK || !HBAO_USE_COS_ANGLE
|
||||
buildTangentBinormal(side, fragUVPos, fragPositionES, fragNormalES, deltaDepthUV, fragFrameES.tangent, fragFrameES.binormal);
|
||||
#endif
|
||||
// Let's make noise
|
||||
float randomPatternRotationAngle = getAngleDithering(fragPixelPos);
|
||||
|
||||
|
@ -74,7 +68,7 @@ void main(void) {
|
|||
if (isHorizonBased()) {
|
||||
for (int i = 0; i < numSamples; ++i) {
|
||||
vec3 deltaTap = getUnitTapLocation(i, 1.0, randomPatternRotationAngle, PI);
|
||||
obscuranceSum += evalVisibilityHBAO(side, fragUVPos, deltaDepthUV, deltaTap.xy, diskPixelRadius, fragPositionES, fragFrameES);
|
||||
obscuranceSum += evalVisibilityHBAO(side, fragUVPos, deltaDepthUV, deltaTap.xy, diskPixelRadius, fragPositionES, fragNormalES);
|
||||
}
|
||||
obscuranceSum *= invNumSamples;
|
||||
#if HBAO_USE_COS_ANGLE
|
||||
|
|
Loading…
Reference in a new issue