mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 20:44:14 +02:00
Put some bilateral blur computation on CPU
This commit is contained in:
parent
6240454c55
commit
fbd158938b
4 changed files with 32 additions and 28 deletions
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue