From 7fd03bed7e1c71276f4f3e8c3f785215701cf4f4 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 10 Nov 2017 14:28:35 +0100 Subject: [PATCH] Added cascades in schema buffer but still only first used --- libraries/render-utils/src/LightStage.cpp | 13 ++++---- libraries/render-utils/src/LightStage.h | 8 ++--- libraries/render-utils/src/Shadow.slh | 15 ++++------ libraries/render-utils/src/Shadows_shared.slh | 30 +++++++++++++++++++ 4 files changed, 45 insertions(+), 21 deletions(-) create mode 100644 libraries/render-utils/src/Shadows_shared.slh diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index eb712b075c..d5dfe92b1d 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -23,10 +23,11 @@ const glm::mat4 LightStage::Shadow::_biasMatrix{ LightStage::LightStage() { } -LightStage::Shadow::Schema::Schema() : - bias{ 0.005f }, - scale{ 1.0f / MAP_SIZE } { - +LightStage::Shadow::Schema::Schema() { + ShadowTransform defaultTransform; + defaultTransform.bias = 0.005f; + std::fill(cascades, cascades + SHADOW_CASCADE_MAX_COUNT, defaultTransform); + invMapSize = 1.0f / MAP_SIZE; } LightStage::Shadow::Shadow(model::LightPointer light) : _light{ light}, _frustum{ std::make_shared() } { @@ -97,7 +98,7 @@ void LightStage::Shadow::setKeylightFrustum(const ViewFrustum& viewFrustum, _frustum->calculate(); // Update the buffer - _schemaBuffer.edit().reprojection = _biasMatrix * ortho * viewInverse.getMatrix(); + _schemaBuffer.edit().cascades[0].reprojection = _biasMatrix * ortho * viewInverse.getMatrix(); } void LightStage::Shadow::setFrustum(const ViewFrustum& shadowFrustum) { @@ -106,7 +107,7 @@ void LightStage::Shadow::setFrustum(const ViewFrustum& shadowFrustum) { *_frustum = shadowFrustum; // Update the buffer - _schemaBuffer.edit().reprojection = _biasMatrix * shadowFrustum.getProjection() * viewInverse.getMatrix(); + _schemaBuffer.edit().cascades[0].reprojection = _biasMatrix * shadowFrustum.getProjection() * viewInverse.getMatrix(); } const glm::mat4& LightStage::Shadow::getView() const { diff --git a/libraries/render-utils/src/LightStage.h b/libraries/render-utils/src/LightStage.h index c45627c89b..3324cfbe99 100644 --- a/libraries/render-utils/src/LightStage.h +++ b/libraries/render-utils/src/LightStage.h @@ -68,15 +68,13 @@ public: model::LightPointer _light; std::shared_ptr _frustum; - class Schema { +#include "Shadows_shared.slh" + + class Schema : public ShadowParameters { public: Schema(); - glm::mat4 reprojection; - - glm::float32 bias; - glm::float32 scale; }; UniformBufferView _schemaBuffer = nullptr; diff --git a/libraries/render-utils/src/Shadow.slh b/libraries/render-utils/src/Shadow.slh index 8abbc1de3e..1f819e95c9 100644 --- a/libraries/render-utils/src/Shadow.slh +++ b/libraries/render-utils/src/Shadow.slh @@ -14,27 +14,22 @@ // the shadow texture uniform sampler2DShadow shadowMap; -struct ShadowTransform { - mat4 reprojection; - - float bias; - float scale; -}; +<@include Shadows_shared.slh@> uniform shadowTransformBuffer { - ShadowTransform _shadowTransform; + ShadowParameters shadow; }; mat4 getShadowReprojection() { - return _shadowTransform.reprojection; + return shadow.cascades[0].reprojection; } float getShadowScale() { - return _shadowTransform.scale; + return shadow.invMapSize; } float getShadowBias() { - return _shadowTransform.bias; + return shadow.cascades[0].bias; } // Compute the texture coordinates from world coordinates diff --git a/libraries/render-utils/src/Shadows_shared.slh b/libraries/render-utils/src/Shadows_shared.slh new file mode 100644 index 0000000000..9e462568ad --- /dev/null +++ b/libraries/render-utils/src/Shadows_shared.slh @@ -0,0 +1,30 @@ +// glsl / C++ compatible source as interface for Shadows +#ifdef __cplusplus +# define MAT4 glm::mat4 +# define VEC3 glm::vec3 +#else +# define MAT4 mat4 +# define VEC3 ve3 +#endif + +#define SHADOW_CASCADE_MAX_COUNT 4 + +struct ShadowTransform { + MAT4 reprojection; + + float bias; + vec3 _padding; +}; + +struct ShadowParameters { + int cascadeCount; + float invMapSize; + float _padding1; + float _padding2; + ShadowTransform cascades[SHADOW_CASCADE_MAX_COUNT]; +}; + +// <@if 1@> +// Trigger Scribe include +// <@endif@> +//