Sfoglia il codice sorgente

Merge pull request #859 from Azaezel/alpha401/probleblendblunder

probe blend adjustments
Brian Roberts 3 anni fa
parent
commit
00d67475e7

+ 8 - 4
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;
       }
    }
 

+ 10 - 5
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;
       }
    }
 

+ 8 - 4
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;
          }
       }
       

+ 9 - 6
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;
          }
       }