Put some bilateral blur computation on CPU

This commit is contained in:
Olivier Prat 2018-09-28 11:31:09 +02:00
parent 6240454c55
commit fbd158938b
4 changed files with 32 additions and 28 deletions

View file

@ -229,7 +229,7 @@ AmbientOcclusionEffect::AOParameters::AOParameters() {
}
AmbientOcclusionEffect::BlurParameters::BlurParameters() {
_blurInfo = { 1.0f, 3.0f, 2.0f, 0.0f };
_blurInfo = { 1.0f, 2.0f, 0.0f, 3.0f };
}
AmbientOcclusionEffect::AmbientOcclusionEffect() {
@ -268,11 +268,26 @@ void AmbientOcclusionEffect::configure(const Config& config) {
current.y = 1.0f / (1.0f - config.falloffAngle);
}
if (config.edgeSharpness != _hblurParametersBuffer.get().getEdgeSharpness()) {
// Update bilateral blur
{
const float BLUR_EDGE_DISTANCE_SCALE = float(10000 * SSAO_DEPTH_KEY_SCALE);
const float BLUR_EDGE_NORMAL_SCALE = 2.0f;
auto& hblur = _hblurParametersBuffer.edit()._blurInfo;
auto& vblur = _vblurParametersBuffer.edit()._blurInfo;
hblur.x = config.edgeSharpness;
vblur.x = config.edgeSharpness;
float blurRadialSigma = float(config.blurRadius) * 0.5f;
float blurRadialScale = 1.0f / (2.0f*blurRadialSigma*blurRadialSigma);
glm::vec3 blurScales = -glm::vec3(blurRadialScale, glm::vec2(BLUR_EDGE_DISTANCE_SCALE, BLUR_EDGE_NORMAL_SCALE) * config.edgeSharpness);
hblur.x = blurScales.x;
hblur.y = blurScales.y;
hblur.z = blurScales.z;
hblur.w = (float)config.blurRadius;
vblur.x = blurScales.x;
vblur.y = blurScales.y;
vblur.z = blurScales.z;
vblur.w = (float)config.blurRadius;
}
if (config.numSpiralTurns != _aoParametersBuffer->getNumSpiralTurns()) {
@ -322,13 +337,6 @@ void AmbientOcclusionEffect::configure(const Config& config) {
current.x = (float)config.resolutionLevel;
shouldUpdateBlurs = true;
}
if (config.blurRadius != _hblurParametersBuffer.get().getBlurRadius()) {
auto& hblur = _hblurParametersBuffer.edit()._blurInfo;
auto& vblur = _vblurParametersBuffer.edit()._blurInfo;
hblur.y = (float)config.blurRadius;
vblur.y = (float)config.blurRadius;
}
if (config.ditheringEnabled != _aoParametersBuffer->isDitheringEnabled()) {
auto& current = _aoParametersBuffer.edit()._ditheringInfo;
@ -357,18 +365,18 @@ void AmbientOcclusionEffect::updateBlurParameters() {
const auto occlusionSize = divideRoundUp(frameSize, resolutionScale);
// Occlusion UV limit
hblur._blurInfo.z = occlusionSize.x / float(frameSize.x);
hblur._blurInfo.w = occlusionSize.y / float(frameSize.y);
hblur._blurAxis.z = occlusionSize.x / float(frameSize.x);
hblur._blurAxis.w = occlusionSize.y / float(frameSize.y);
vblur._blurInfo.z = 1.0f;
vblur._blurInfo.w = occlusionSize.y / float(frameSize.y);
vblur._blurAxis.z = 1.0f;
vblur._blurAxis.w = occlusionSize.y / float(frameSize.y);
// Occlusion axis
hblur._blurAxis.x = hblur._blurInfo.z / occlusionSize.x;
hblur._blurAxis.x = hblur._blurAxis.z / occlusionSize.x;
hblur._blurAxis.y = 0.0f;
vblur._blurAxis.x = 0.0f;
vblur._blurAxis.y = vblur._blurInfo.w / occlusionSize.y;
vblur._blurAxis.y = vblur._blurAxis.w / occlusionSize.y;
}
void AmbientOcclusionEffect::updateFramebufferSizes() {

View file

@ -16,8 +16,6 @@
<@func declarePackOcclusionDepth()@>
#define SSAO_DEPTH_KEY_SCALE 300.0
float CSZToDepthKey(float z) {
return clamp(z * (-1.0 / SSAO_DEPTH_KEY_SCALE), 0.0, 1.0);
}

View file

@ -31,15 +31,15 @@ vec2 getBlurOcclusionAxis() {
}
vec2 getBlurOcclusionUVLimit() {
return blurParams._blurInfo.zw;
return blurParams._blurAxis.zw;
}
float getBlurEdgeSharpness() {
return blurParams._blurInfo.x;
vec3 getBlurScales() {
return blurParams._blurInfo.xyz;
}
int getBlurRadius() {
return int(blurParams._blurInfo.y);
return int(blurParams._blurInfo.w);
}
vec4 fetchOcclusionPacked(ivec4 side, vec2 texCoord) {
@ -52,8 +52,6 @@ float evalBlurCoefficient(vec3 blurScales, float radialDistance, float zDistance
return exp2(dot(blurScales, distances*distances));
}
const float BLUR_EDGE_DISTANCE_SCALE = 10000 * SSAO_DEPTH_KEY_SCALE;
const float BLUR_EDGE_NORMAL_SCALE = 2.0;
const float BLUR_EDGE_NORMAL_LIMIT = 0.25;
vec2 evalTapWeightedValue(vec3 blurScales, ivec4 side, int r, vec2 occlusionTexCoord, vec2 depthTexCoord, float fragDepth, vec3 fragNormal) {
@ -98,9 +96,7 @@ vec4 getBlurredOcclusion(ivec2 destPixelCoord, vec2 occlusionTexCoord, vec2 dept
// Accumulate weighted contributions along the bluring axis in the [-radius, radius] range
int blurRadius = getBlurRadius();
float blurRadialSigma = float(blurRadius) * 0.5;
float blurRadialScale = 1.0 / (2.0*blurRadialSigma*blurRadialSigma);
vec3 blurScales = -vec3(blurRadialScale, vec2(BLUR_EDGE_DISTANCE_SCALE, BLUR_EDGE_NORMAL_SCALE) * getBlurEdgeSharpness());
vec3 blurScales = getBlurScales();
// negative side first
for (int r = -blurRadius; r <= -1; ++r) {

View file

@ -17,6 +17,8 @@
#define SSAO_USE_QUAD_SPLIT 1
#define SSAO_BILATERAL_BLUR_USE_NORMAL 0
#define SSAO_DEPTH_KEY_SCALE 300.0
#if SSAO_USE_QUAD_SPLIT
#define SSAO_SPLIT_LOG2_COUNT 2
#else