2
0
Azaezel 6 жил өмнө
parent
commit
907bac02e0

+ 34 - 101
Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl

@@ -82,97 +82,32 @@ float3 iblSkylightSpecular(Surface surface, ProbeData probe)
 
 
 float3 iblBoxDiffuse( Surface surface, ProbeData probe)
 float3 iblBoxDiffuse( Surface surface, ProbeData probe)
 {
 {
-   float3 wsPosition;
-   float radius;
-   float3 boxMin;
-   float3 boxMax;
-   float attenuation;
-   float4x4 worldToLocal;
-   uint probeIdx;
-   uint type; //box = 0, sphere = 1
-   float contribution;
-   float3 refPosition;
-   float3 pad;   
-   
-   inline void defineSphereSpaceInfluence(Surface surface, float3 wsEyeRay)
-   {
-      float3 L = wsPosition.xyz - surface.P;
-      contribution = 1.0 - length(L) / radius;
-   }
-
-   inline void defineBoxSpaceInfluence(Surface surface, float3 wsEyeRay)
-   {
-      float3 surfPosLS = mul(worldToLocal, float4(surface.P, 1.0)).xyz;
-
-      float3 boxMinLS = wsPosition.xyz - (float3(1, 1, 1)*radius);
-      float3 boxMaxLS = wsPosition.xyz + (float3(1, 1, 1)*radius);
-
-      float boxOuterRange = length(boxMaxLS - boxMinLS);
-      float boxInnerRange = boxOuterRange / attenuation;
-
-      float3 localDir = float3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z));
-      localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange);
-
-      contribution = max(localDir.x, max(localDir.y, localDir.z)) * -1;
-   }   
-   
-   // Box Projected IBL Lighting
-   // Based on: http://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/
-   // 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 = normalize(surface.R);
-      float3 offset = surface.P;
-      float3 plane1vec = (boxMax - offset) / nrdir;
-      float3 plane2vec = (boxMin - offset) / nrdir;
+   float3 dir = boxProject(surface, probe);
 
 
-      float3 furthestPlane = max(plane1vec, plane2vec);
-      float dist = min(min(furthestPlane.x, furthestPlane.y), furthestPlane.z);
-      float3 posonbox = offset + nrdir * dist;
-
-      return posonbox - refPosition;
-   }
-   
-   inline float3 iblBoxDiffuse( Surface surface)
-   {
-      float3 dir = boxProject(surface);
-
-      float lod = surface.roughness*cubeMips;
-      float3 color = TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, probeIdx, lod).xyz;
-      if (contribution>0)
-         return color*contribution;
-      else
-         return float3(0,0,0);
-   }
+   float lod = surface.roughness*cubeMips;
+   float3 color = TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, probe.probeIdx, lod).xyz;
 
 
-   inline float3 iblBoxSpecular(Surface surface)
-   {
-      // BRDF
-      float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, surface.NdotV,0.0,0.0)).xy;
+   return color;
+}
 
 
-      float3 dir = boxProject(surface);
+float3 iblBoxSpecular(Surface surface, ProbeData probe)
+{
+    // BRDF
+   float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, surface.NdotV,0.0,0.0)).xy;
 
 
-      // Radiance (Specular)
-   #if DEBUGVIZ_SPECCUBEMAP == 0
-      float lod = surface.roughness*cubeMips;
-   #elif DEBUGVIZ_SPECCUBEMAP == 1
-      float lod = 0;
-   #endif
+   float3 dir = boxProject(surface, probe);
 
 
-      float3 color = TORQUE_TEXCUBEARRAYLOD(cubeMapAR, dir, probeIdx, lod).xyz * (brdf.x + brdf.y);
+    // Radiance (Specular)
+#if DEBUGVIZ_SPECCUBEMAP == 0
+   float lod = surface.roughness*cubeMips;
+#elif DEBUGVIZ_SPECCUBEMAP == 1
+   float lod = 0;
+#endif
 
 
-      if (contribution>0)
-         return color*contribution;
-      else
-         return float3(0,0,0);
-   }
-   
-   inline void reweight(float bias)
-   {
-      contribution = bias;
-   }
-};
+   float3 color = TORQUE_TEXCUBEARRAYLOD(cubeMapAR, dir, probe.probeIdx, lod).xyz * (brdf.x + brdf.y);
 
 
+   return color;
+}
 
 
 float4 main( PFXVertToPix IN ) : SV_TARGET
 float4 main( PFXVertToPix IN ) : SV_TARGET
 {
 {
@@ -190,6 +125,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
    }     
    }     
 
 
    int i = 0;
    int i = 0;
+   float blendVal[MAX_PROBES];
    float blendFactor[MAX_PROBES];
    float blendFactor[MAX_PROBES];
    float blendSum = 0;
    float blendSum = 0;
    float blendFacSum = 0;
    float blendFacSum = 0;
@@ -214,11 +150,11 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
 
 
       if (probes[i].type == 0) //box
       if (probes[i].type == 0) //box
       {
       {
-         probes[i].defineBoxSpaceInfluence(surface, IN.wsEyeRay);
+         blendVal[i] = defineBoxSpaceInfluence(surface, probes[i], IN.wsEyeRay);
       }
       }
       else if (probes[i].type == 1) //sphere
       else if (probes[i].type == 1) //sphere
       {
       {
-         probes[i].defineSphereSpaceInfluence(surface,IN.wsEyeRay);
+         blendVal[i] = defineSphereSpaceInfluence(surface, probes[i], IN.wsEyeRay);
       }
       }
       else //skylight
       else //skylight
       {
       {
@@ -240,36 +176,33 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
    {
    {
       if (numProbes>1)
       if (numProbes>1)
       {
       {
-         blendFactor[i] = (( probes[i].contribution / blendSum)) / (numProbes - 1);
-         blendFactor[i] *= (( probes[i].contribution) / invBlendSum);
+         blendFactor[i] = ((1.0f - blendVal[i] / blendSum)) / (numProbes - 1);
+         blendFactor[i] *= ((1.0f - blendVal[i]) / invBlendSum);
          blendFacSum += blendFactor[i];
          blendFacSum += blendFactor[i];
       }
       }
       else
       else
       {
       {
-         blendFactor[i] = probes[i].contribution;
-         blendFacSum = probes[i].contribution;
+         blendFactor[i] = blendVal[i];
+         blendFacSum = blendVal[i];
       }
       }
    }
    }
 
 
    // Normalize blendVal
    // 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
    if (blendFacSum == 0.0f) // Possible with custom weight
    {
    {
       blendFacSum = 1.0f;
       blendFacSum = 1.0f;
    }
    }
+#endif
 
 
    float invBlendSumWeighted = 1.0f / blendFacSum;
    float invBlendSumWeighted = 1.0f / blendFacSum;
    for (i = 0; i < numProbes; ++i)
    for (i = 0; i < numProbes; ++i)
    {
    {
       blendFactor[i] *= invBlendSumWeighted;
       blendFactor[i] *= invBlendSumWeighted;
-      probes[i].reweight(blendFactor[i]);
    }
    }
+   
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
-   float attenVis = 0;
-   for (i = 0; i < numProbes; ++i)
-   {
-      attenVis += probes[i].contribution;
-   }
-   return float4(attenVis, attenVis, attenVis, 1);
+   return float4(blendFacSum, blendFacSum, blendFacSum, 1);
 #endif
 #endif
 
 
 #if DEBUGVIZ_CONTRIB == 1
 #if DEBUGVIZ_CONTRIB == 1
@@ -277,10 +210,10 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
    float3 finalContribColor = float3(0, 0, 0);
    float3 finalContribColor = float3(0, 0, 0);
    for (i = 0; i < numProbes; ++i)
    for (i = 0; i < numProbes; ++i)
    {
    {
-      if (probes[i].contribution == 0)
+      if (blendFactor[i] == 0)
          continue;
          continue;
 
 
-      finalContribColor += probes[i].contribution * probeContribColors[i].rgb;
+      finalContribColor += blendFactor[i] * probeContribColors[i].rgb;
    }
    }
 
 
    return float4(finalContribColor, 1);
    return float4(finalContribColor, 1);
@@ -297,7 +230,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
    kD *= 1.0 - surface.metalness;
    kD *= 1.0 - surface.metalness;
    for (i = 0; i < numProbes; ++i)
    for (i = 0; i < numProbes; ++i)
    {
    {
-      if (probes[i].contribution == 0)
+      if (blendVal[i] == 0)
          continue;
          continue;
 
 
       if (probes[i].type == 2) //skylight
       if (probes[i].type == 2) //skylight
@@ -351,4 +284,4 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
 
 
    return float4(cubeColor, 1);
    return float4(cubeColor, 1);
 #endif
 #endif
-}
+}