diff --git a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl index 37d9df0d1..998dcfb46 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl @@ -382,6 +382,7 @@ vec4 computeForwardProbes(Surface surface, float probehits = 0; //Set up our struct data float contribution[MAX_FORWARD_PROBES]; + float blendCap = 0; for (i = 0; i < numProbes; ++i) { contribution[i] = 0; @@ -401,21 +402,24 @@ vec4 computeForwardProbes(Surface surface, contribution[i] = 0.0; blendSum += contribution[i]; + blendCap = max(contribution[i],blendCap); } - if (probehits > 1.0)//if we overlap + if (probehits > 0.0) { - invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder + invBlendSum = (probehits - blendSum)/probehits; //grab the remainder for (i = 0; i < numProbes; i++) { blendFactor[i] = contribution[i]/blendSum; //what % total is this instance - blendFactor[i] *= blendFactor[i] / invBlendSum; //what should we add to sum to 1 + blendFactor[i] *= blendFactor[i]/invBlendSum; //what should we add to sum to 1 blendFacSum += blendFactor[i]; //running tally of results } for (i = 0; i < numProbes; ++i) { - contribution[i] *= blendFactor[i]/blendFacSum; //normalize + //normalize, but in the range of the highest value applied + //to preserve blend vs skylight + contribution[i] = blendFactor[i]/blendFacSum*blendCap; } } diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl index 659ab36b6..2f4c6af5f 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl @@ -386,6 +386,8 @@ float4 computeForwardProbes(Surface surface, float probehits = 0; //Set up our struct data float contribution[MAX_FORWARD_PROBES]; + + float blendCap = 0; //Process prooooobes for (i = 0; i < numProbes; ++i) { @@ -406,21 +408,24 @@ float4 computeForwardProbes(Surface surface, contribution[i] = 0.0; blendSum += contribution[i]; + blendCap = max(contribution[i],blendCap); } - if (probehits > 1.0)//if we overlap + if (probehits > 0.0) { - invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder + invBlendSum = (probehits - blendSum)/probehits; //grab the remainder for (i = 0; i < numProbes; i++) { blendFactor[i] = contribution[i]/blendSum; //what % total is this instance - blendFactor[i] *= blendFactor[i] / invBlendSum; //what should we add to sum to 1 + blendFactor[i] *= blendFactor[i]/invBlendSum; //what should we add to sum to 1 blendFacSum += blendFactor[i]; //running tally of results } for (i = 0; i < numProbes; ++i) - { - contribution[i] *= blendFactor[i]/blendFacSum; //normalize + { + //normalize, but in the range of the highest value applied + //to preserve blend vs skylight + contribution[i] = blendFactor[i]/blendFacSum*blendCap; } } diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl index 3b04224ac..69988e4b3 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl @@ -78,6 +78,7 @@ void main() //Set up our struct data float contribution[MAX_PROBES]; + float blendCap = 0; if (alpha > 0) { //Process prooooobes @@ -101,21 +102,24 @@ void main() contribution[i] = 0; blendSum += contribution[i]; + blendCap = max(contribution[i],blendCap); } - if (probehits > 1.0)//if we overlap + if (probehits > 0.0) { - invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder + invBlendSum = (probehits - blendSum)/probehits; //grab the remainder for (i = 0; i < numProbes; i++) { blendFactor[i] = contribution[i]/blendSum; //what % total is this instance - blendFactor[i] *= blendFactor[i] / invBlendSum; //what should we add to sum to 1 + blendFactor[i] *= blendFactor[i]/invBlendSum; //what should we add to sum to 1 blendFacSum += blendFactor[i]; //running tally of results } for (i = 0; i < numProbes; ++i) { - contribution[i] *= blendFactor[i]/blendFacSum; //normalize + //normalize, but in the range of the highest value applied + //to preserve blend vs skylight + contribution[i] = blendFactor[i]/blendFacSum*blendCap; } } diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl index 484e38022..741340d05 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl @@ -69,7 +69,8 @@ float4 main(PFXVertToPix IN) : SV_TARGET float probehits = 0; //Set up our struct data float contribution[MAX_PROBES]; - + + float blendCap = 0; if (alpha > 0) { //Process prooooobes @@ -93,21 +94,23 @@ float4 main(PFXVertToPix IN) : SV_TARGET contribution[i] = 0.0; blendSum += contribution[i]; + blendCap = max(contribution[i],blendCap); } - - if (probehits > 1.0)//if we overlap + if (probehits > 0.0) { - invBlendSum = (probehits - blendSum)/(probehits-1); //grab the remainder + invBlendSum = (probehits - blendSum)/probehits; //grab the remainder for (i = 0; i < numProbes; i++) { blendFactor[i] = contribution[i]/blendSum; //what % total is this instance - blendFactor[i] *= blendFactor[i] / invBlendSum; //what should we add to sum to 1 + blendFactor[i] *= blendFactor[i]/invBlendSum; //what should we add to sum to 1 blendFacSum += blendFactor[i]; //running tally of results } for (i = 0; i < numProbes; ++i) { - contribution[i] *= blendFactor[i]/blendFacSum; //normalize + //normalize, but in the range of the highest value applied + //to preserve blend vs skylight + contribution[i] = blendFactor[i]/blendFacSum*blendCap; } }