diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 66e59ddad0..0a7a15ecbd 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -30,9 +30,6 @@ #include "DependencyManager.h" #include "ViewFrustum.h" -// Should match value in ssao_makeOcclusion.slf -#define SSAO_USE_HORIZON_BASED 1 - gpu::PipelinePointer AmbientOcclusionEffect::_occlusionPipeline; gpu::PipelinePointer AmbientOcclusionEffect::_hBlurPipeline; gpu::PipelinePointer AmbientOcclusionEffect::_vBlurPipeline; @@ -203,13 +200,12 @@ AmbientOcclusionEffectConfig::AmbientOcclusionEffectConfig() : } -AmbientOcclusionEffect::AOParameters::AOParameters() : -resolutionInfo{ -1.0f, 0.0f, 1.0f, 0.0f }, -radiusInfo{ 0.5f, 0.5f * 0.5f, 1.0f / (0.25f * 0.25f * 0.25f), 1.0f }, -ditheringInfo{ 0.0f, 0.0f, 0.01f, 1.0f }, -sampleInfo{ 11.0f, 1.0f / 11.0f, 7.0f, 1.0f }, -blurInfo{ 1.0f, 3.0f, 2.0f, 0.0f } { - +AmbientOcclusionEffect::AOParameters::AOParameters() { + _resolutionInfo = { -1.0f, 0.0f, 1.0f, 0.0f }; + _radiusInfo = { 0.5f, 0.5f * 0.5f, 1.0f / (0.25f * 0.25f * 0.25f), 1.0f }; + _ditheringInfo = { 0.0f, 0.0f, 0.01f, 1.0f }; + _sampleInfo = { 11.0f, 1.0f / 11.0f, 7.0f, 1.0f }; + _blurInfo = { 1.0f, 3.0f, 2.0f, 0.0f }; } AmbientOcclusionEffect::AmbientOcclusionEffect() { @@ -224,7 +220,7 @@ void AmbientOcclusionEffect::configure(const Config& config) { const double RADIUS_POWER = 6.0; const auto& radius = config.radius; if (radius != _aoParametersBuffer->getRadius()) { - auto& current = _aoParametersBuffer.edit().radiusInfo; + auto& current = _aoParametersBuffer.edit()._radiusInfo; current.x = radius; current.y = radius * radius; current.z = 10.0f; @@ -234,40 +230,40 @@ void AmbientOcclusionEffect::configure(const Config& config) { } if (config.obscuranceLevel != _aoParametersBuffer->getObscuranceLevel()) { - auto& current = _aoParametersBuffer.edit().radiusInfo; + auto& current = _aoParametersBuffer.edit()._radiusInfo; current.w = config.obscuranceLevel; } if (config.falloffAngle != _aoParametersBuffer->getFalloffAngle()) { - auto& current = _aoParametersBuffer.edit().ditheringInfo; + auto& current = _aoParametersBuffer.edit()._ditheringInfo; current.z = config.falloffAngle; current.y = 1.0f / (1.0f - config.falloffAngle); } if (config.edgeSharpness != _aoParametersBuffer->getEdgeSharpness()) { - auto& current = _aoParametersBuffer.edit().blurInfo; + auto& current = _aoParametersBuffer.edit()._blurInfo; current.x = config.edgeSharpness; } if (config.blurDeviation != _aoParametersBuffer->getBlurDeviation()) { - auto& current = _aoParametersBuffer.edit().blurInfo; + auto& current = _aoParametersBuffer.edit()._blurInfo; current.z = config.blurDeviation; shouldUpdateGaussian = true; } if (config.numSpiralTurns != _aoParametersBuffer->getNumSpiralTurns()) { - auto& current = _aoParametersBuffer.edit().sampleInfo; + auto& current = _aoParametersBuffer.edit()._sampleInfo; current.z = config.numSpiralTurns; } if (config.numSamples != _aoParametersBuffer->getNumSamples()) { - auto& current = _aoParametersBuffer.edit().sampleInfo; + auto& current = _aoParametersBuffer.edit()._sampleInfo; current.x = config.numSamples; current.y = 1.0f / config.numSamples; } if (config.fetchMipsEnabled != _aoParametersBuffer->isFetchMipsEnabled()) { - auto& current = _aoParametersBuffer.edit().sampleInfo; + auto& current = _aoParametersBuffer.edit()._sampleInfo; current.w = (float)config.fetchMipsEnabled; } @@ -277,28 +273,28 @@ void AmbientOcclusionEffect::configure(const Config& config) { } if (config.perspectiveScale != _aoParametersBuffer->getPerspectiveScale()) { - _aoParametersBuffer.edit().resolutionInfo.z = config.perspectiveScale; + _aoParametersBuffer.edit()._resolutionInfo.z = config.perspectiveScale; } if (config.resolutionLevel != _aoParametersBuffer->getResolutionLevel()) { - auto& current = _aoParametersBuffer.edit().resolutionInfo; + auto& current = _aoParametersBuffer.edit()._resolutionInfo; current.x = (float) config.resolutionLevel; shouldUpdateBlurs = true; } if (config.blurRadius != _aoParametersBuffer->getBlurRadius()) { - auto& current = _aoParametersBuffer.edit().blurInfo; + auto& current = _aoParametersBuffer.edit()._blurInfo; current.y = (float)config.blurRadius; shouldUpdateGaussian = true; } if (config.ditheringEnabled != _aoParametersBuffer->isDitheringEnabled()) { - auto& current = _aoParametersBuffer.edit().ditheringInfo; + auto& current = _aoParametersBuffer.edit()._ditheringInfo; current.x = (float)config.ditheringEnabled; } if (config.borderingEnabled != _aoParametersBuffer->isBorderingEnabled()) { - auto& current = _aoParametersBuffer.edit().ditheringInfo; + auto& current = _aoParametersBuffer.edit()._ditheringInfo; current.w = (float)config.borderingEnabled; } @@ -377,7 +373,7 @@ const gpu::PipelinePointer& AmbientOcclusionEffect::getMipCreationPipeline() { void AmbientOcclusionEffect::updateGaussianDistribution() { auto coefs = _aoParametersBuffer.edit()._gaussianCoefs; - GaussianDistribution::evalSampling(coefs, AOParameters::GAUSSIAN_COEFS_LENGTH, _aoParametersBuffer->getBlurRadius(), _aoParametersBuffer->getBlurDeviation()); + GaussianDistribution::evalSampling(coefs, SSAO_BLUR_GAUSSIAN_COEFS_COUNT, _aoParametersBuffer->getBlurRadius(), _aoParametersBuffer->getBlurDeviation()); } void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs) { diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h index 4021768995..86754d494b 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ b/libraries/render-utils/src/AmbientOcclusionEffect.h @@ -115,42 +115,30 @@ public: void configure(const Config& config); void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs); - + +#include "ssao_shared.h" // Class describing the uniform buffer with all the parameters common to the AO shaders - class AOParameters { + class AOParameters : public AmbientOcclusionParams { public: - // Resolution info - glm::vec4 resolutionInfo; - // radius info is { R, R^2, 1 / R^6, ObscuranceScale} - glm::vec4 radiusInfo; - // Dithering info - glm::vec4 ditheringInfo; - // Sampling info - glm::vec4 sampleInfo; - // Blurring info - glm::vec4 blurInfo; - // gaussian distribution coefficients first is the sampling radius (max is 6) - const static int GAUSSIAN_COEFS_LENGTH = 16; - float _gaussianCoefs[GAUSSIAN_COEFS_LENGTH]; - + AOParameters(); - int getResolutionLevel() const { return resolutionInfo.x; } - float getRadius() const { return radiusInfo.x; } - float getPerspectiveScale() const { return resolutionInfo.z; } - float getObscuranceLevel() const { return radiusInfo.w; } - float getFalloffAngle() const { return (float)ditheringInfo.z; } - float getEdgeSharpness() const { return (float)blurInfo.x; } - float getBlurDeviation() const { return blurInfo.z; } + int getResolutionLevel() const { return _resolutionInfo.x; } + float getRadius() const { return _radiusInfo.x; } + float getPerspectiveScale() const { return _resolutionInfo.z; } + float getObscuranceLevel() const { return _radiusInfo.w; } + float getFalloffAngle() const { return (float)_ditheringInfo.z; } + float getEdgeSharpness() const { return (float)_blurInfo.x; } + float getBlurDeviation() const { return _blurInfo.z; } - float getNumSpiralTurns() const { return sampleInfo.z; } - int getNumSamples() const { return (int)sampleInfo.x; } - bool isFetchMipsEnabled() const { return sampleInfo.w; } + float getNumSpiralTurns() const { return _sampleInfo.z; } + int getNumSamples() const { return (int)_sampleInfo.x; } + bool isFetchMipsEnabled() const { return _sampleInfo.w; } - int getBlurRadius() const { return (int)blurInfo.y; } - bool isDitheringEnabled() const { return ditheringInfo.x; } - bool isBorderingEnabled() const { return ditheringInfo.w; } + int getBlurRadius() const { return (int)_blurInfo.y; } + bool isDitheringEnabled() const { return _ditheringInfo.x; } + bool isBorderingEnabled() const { return _ditheringInfo.w; } }; using AOParametersBuffer = gpu::StructBuffer; diff --git a/libraries/render-utils/src/ssao.slh b/libraries/render-utils/src/ssao.slh index 63dadc9bec..38b7999924 100644 --- a/libraries/render-utils/src/ssao.slh +++ b/libraries/render-utils/src/ssao.slh @@ -12,6 +12,7 @@ <@def SSAO_SLH@> <@include render-utils/ShaderConstants.h@> +<@include ssao_shared.h@> <@func declarePackOcclusionDepth()@> @@ -35,15 +36,6 @@ vec2 unpackOcclusionDepth(vec3 raw) { <@include DeferredTransform.slh@> <$declareDeferredFrameTransform()$> -struct AmbientOcclusionParams { - vec4 _resolutionInfo; - vec4 _radiusInfo; - vec4 _ditheringInfo; - vec4 _sampleInfo; - vec4 _blurInfo; - float _gaussianCoefs[16]; -}; - layout(binding=RENDER_UTILS_BUFFER_SSAO_PARAMS) uniform ambientOcclusionParamsBuffer { AmbientOcclusionParams params; }; @@ -456,4 +448,4 @@ vec3 getBlurredOcclusion(ivec2 destPixelCoord, vec2 scaledTexCoord, vec2 fullTex <@endfunc@> -<@endif@> \ No newline at end of file +<@endif@> diff --git a/libraries/render-utils/src/ssao_makeHorizontalBlur.slf b/libraries/render-utils/src/ssao_makeHorizontalBlur.slf index 2d02ed02f0..fc90052eed 100644 --- a/libraries/render-utils/src/ssao_makeHorizontalBlur.slf +++ b/libraries/render-utils/src/ssao_makeHorizontalBlur.slf @@ -13,6 +13,8 @@ <@include ssao.slh@> +// Hack comment + const ivec2 horizontal = ivec2(1,0); <$declareBlurPass(horizontal)$> diff --git a/libraries/render-utils/src/ssao_makeOcclusion.slf b/libraries/render-utils/src/ssao_makeOcclusion.slf index 94e87c75e0..8c8832634c 100644 --- a/libraries/render-utils/src/ssao_makeOcclusion.slf +++ b/libraries/render-utils/src/ssao_makeOcclusion.slf @@ -19,7 +19,6 @@ <$declarePackOcclusionDepth()$> -#define SSAO_USE_HORIZON_BASED 1 #define SSAO_HBAO_MAX_RADIUS 100.0 layout(location=0) out vec4 outFragColor; diff --git a/libraries/render-utils/src/ssao_makeVerticalBlur.slf b/libraries/render-utils/src/ssao_makeVerticalBlur.slf index 1ef6666424..69b92000de 100644 --- a/libraries/render-utils/src/ssao_makeVerticalBlur.slf +++ b/libraries/render-utils/src/ssao_makeVerticalBlur.slf @@ -12,6 +12,8 @@ // <@include ssao.slh@> +// Hack comment + const ivec2 vertical = ivec2(0,1); <$declareBlurPass(vertical)$> diff --git a/libraries/render-utils/src/ssao_shared.h b/libraries/render-utils/src/ssao_shared.h new file mode 100644 index 0000000000..6b71c20c43 --- /dev/null +++ b/libraries/render-utils/src/ssao_shared.h @@ -0,0 +1,44 @@ +// + +// <@if not RENDER_UTILS_SSAO_SHARED_H@> +// <@def RENDER_UTILS_SSAO_SHARED_H@> + +// Hack comment to absorb the extra '//' scribe prepends + +#ifndef RENDER_UTILS_SSAO_SHARED_H +#define RENDER_UTILS_SSAO_SHARED_H + +#define SSAO_USE_HORIZON_BASED 1 +#define SSAO_BLUR_GAUSSIAN_COEFS_COUNT 16 + +// glsl / C++ compatible source as interface for Shadows +#ifdef __cplusplus +# define SSAO_VEC4 glm::vec4 +#else +# define SSAO_VEC4 vec4 +#endif + +struct AmbientOcclusionParams { + SSAO_VEC4 _resolutionInfo; + SSAO_VEC4 _radiusInfo; + SSAO_VEC4 _ditheringInfo; + SSAO_VEC4 _sampleInfo; + SSAO_VEC4 _blurInfo; + float _gaussianCoefs[SSAO_BLUR_GAUSSIAN_COEFS_COUNT]; +}; + +#endif // RENDER_UTILS_SHADER_CONSTANTS_H + +// <@if 1@> +// Trigger Scribe include +// <@endif@> + +// <@endif@> + +// Hack Comment \ No newline at end of file