From 2552bb1f646eb394b6db1c22e4a134090cdd8a6f Mon Sep 17 00:00:00 2001 From: Azaezel Date: Mon, 25 Feb 2019 12:37:05 -0600 Subject: [PATCH] EXPERIMENTATION: for paranoias sake, go ahead and normalize the reflection vector input for boxproject, throw out any out of range contributions (HACK ALERT!) and, what would appear to be the most corrective, reverse the blendfactor math. --- .../advanced/reflectionProbeArrayP.hlsl | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl index 2cfdb5f67..f16fe47bc 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl @@ -74,7 +74,7 @@ struct ProbeData // and https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ inline float3 boxProject(Surface surface) //float3 wsPosition, float3 wsEyeRay, float3 reflectDir, float3 boxWSPos, float3 boxMin, float3 boxMax { - float3 nrdir = surface.R; + float3 nrdir = normalize(surface.R); float3 offset = surface.P; float3 plane1vec = (boxMax - offset) / nrdir; float3 plane2vec = (boxMin - offset) / nrdir; @@ -86,17 +86,19 @@ struct ProbeData return posonbox - refPosition; } - float3 iblBoxDiffuse( Surface surface) + inline float3 iblBoxDiffuse( Surface surface) { float3 dir = boxProject(surface); float lod = surface.roughness*cubeMips; float3 color = TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, probeIdx, lod).xyz; - - return color; + if (contribution>0) + return color*contribution; + else + return float3(0,0,0); } - float3 iblBoxSpecular(Surface surface) + inline float3 iblBoxSpecular(Surface surface) { // BRDF float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, surface.NdotV,0.0,0.0)).xy; @@ -112,7 +114,15 @@ struct ProbeData float3 color = TORQUE_TEXCUBEARRAYLOD(cubeMapAR, dir, probeIdx, lod).xyz * (brdf.x + brdf.y); - return color; + if (contribution>0) + return color*contribution; + else + return float3(0,0,0); + } + + inline void reweight(float bias) + { + contribution = bias; } }; @@ -163,8 +173,8 @@ float4 main( PFXVertToPix IN ) : SV_TARGET { probes[i].defineSphereSpaceInfluence(surface,IN.wsEyeRay); } - - probes[i].contribution = saturate(probes[i].contribution); + if (probes[i].contribution>1||probes[i].contribution<0) + probes[i].contribution = 0; blendSum += probes[i].contribution; invBlendSum += (1.0f - probes[i].contribution); } @@ -178,8 +188,8 @@ float4 main( PFXVertToPix IN ) : SV_TARGET { if (numProbes>1) { - blendFactor[i] = ((1.0f - probes[i].contribution / blendSum)) / (numProbes - 1); - blendFactor[i] *= ((1.0f - probes[i].contribution) / invBlendSum); + blendFactor[i] = (( probes[i].contribution / blendSum)) / (numProbes - 1); + blendFactor[i] *= (( probes[i].contribution) / invBlendSum); blendFacSum += blendFactor[i]; } else @@ -190,21 +200,24 @@ float4 main( PFXVertToPix IN ) : SV_TARGET } // Normalize blendVal -#if DEBUGVIZ_ATTENUATION == 0 //this can likely be removed when we fix the above normalization behavior if (blendFacSum == 0.0f) // Possible with custom weight { blendFacSum = 1.0f; } -#endif float invBlendSumWeighted = 1.0f / blendFacSum; for (i = 0; i < numProbes; ++i) { blendFactor[i] *= invBlendSumWeighted; + probes[i].reweight(blendFactor[i]); } - #if DEBUGVIZ_ATTENUATION == 1 - return float4(blendFacSum, blendFacSum, blendFacSum, 1); + float attenVis = 0; + for (i = 0; i < numProbes; ++i) + { + attenVis += probes[i].contribution; + } + return float4(attenVis, attenVis, attenVis, 1); #endif #if DEBUGVIZ_CONTRIB == 1 @@ -212,10 +225,10 @@ float4 main( PFXVertToPix IN ) : SV_TARGET float3 finalContribColor = float3(0, 0, 0); for (i = 0; i < numProbes; ++i) { - if (blendFactor[i] == 0) + if (probes[i].contribution == 0) continue; - finalContribColor += blendFactor[i] * probeContribColors[i].rgb; + finalContribColor += probes[i].contribution * probeContribColors[i].rgb; } return float4(finalContribColor, 1); @@ -235,9 +248,9 @@ float4 main( PFXVertToPix IN ) : SV_TARGET if (probes[i].contribution == 0) continue; - irradiance += blendFactor[i]*probes[i].iblBoxDiffuse(surface); + irradiance += probes[i].iblBoxDiffuse(surface); - specular += blendFactor[i]*F*probes[i].iblBoxSpecular(surface); + specular += F*probes[i].iblBoxSpecular(surface); } //final diffuse color @@ -250,7 +263,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET float3 cubeColor = float3(0, 0, 0); for (i = 0; i < numProbes; ++i) { - cubeColor += blendFactor[i] * probes[i].iblBoxSpecular(surface); + cubeColor += probes[i].iblBoxSpecular(surface); } return float4(cubeColor, 1); @@ -258,7 +271,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET float3 cubeColor = float3(0, 0, 0); for (i = 0; i < numProbes; ++i) { - cubeColor += blendFactor[i] * probes[i].iblBoxDiffuse(surface); + cubeColor += probes[i].iblBoxDiffuse(surface); } return float4(cubeColor, 1);