Pārlūkot izejas kodu

correct for mip weighting

AzaezelX 1 mēnesi atpakaļ
vecāks
revīzija
958e0d5127

+ 11 - 8
Templates/BaseGame/game/core/postFX/scripts/HDR/HDR_Bloom/downSampleP.hlsl

@@ -29,12 +29,14 @@ uniform int mipCount0;
  
 float4 main(PFXVertToPix IN) : TORQUE_TARGET0
 {
-  float4 downSample = float4(0, 0, 0, 0);
-  float x = oneOverTargetSize.x;
-  float y = oneOverTargetSize.y;
+  float4 downSample = float4(0, 0, 0, 0);  
+  float4 finalOut = float4(0, 0, 0, 0);
   
   for (int mipId = 0; mipId<mipCount0; mipId++)
   {
+    float mipWeight = float(mipId)/float(mipCount0);
+    float x = oneOverTargetSize.x*pow(0.5, mipId);
+    float y = oneOverTargetSize.y*pow(0.5, mipId);
     float3 a = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - 2 * x, IN.uv0.y + 2*y, 0, mipId)).rgb;
     float3 b = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x		   , IN.uv0.y + 2*y, 0, mipId)).rgb;
     float3 c = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + 2 * x, IN.uv0.y + 2*y, 0, mipId)).rgb;
@@ -71,13 +73,14 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0
             break;
 		
         default:
-            downSample.rgb = e*0.125;
-            downSample.rgb += (a+c+g+i)*0.03125;
-            downSample.rgb += (b+d+f+h)*0.0625;
-            downSample.rgb += (j+k+l+m)*0.125;
+            downSample.rgb = e*mipWeight;
+            downSample.rgb += (a+c+g+i)*mipWeight*0.125;
+            downSample.rgb += (b+d+f+h)*mipWeight*0.25;
+            downSample.rgb += (j+k+l+m)*mipWeight*0.5;
             downSample.a = 1.0;
             break;
     }
+    finalOut += downSample*(1.0-mipWeight);
   }
-  return downSample;
+  return float4(finalOut.rgb,1);
 }

+ 14 - 12
Templates/BaseGame/game/core/postFX/scripts/HDR/HDR_Bloom/upSampleP.hlsl

@@ -33,20 +33,20 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0
   float4 finalOut = float4(0, 0, 0, 0);
   for (int mipId = 0; mipId<mipCount0; mipId++)
   {
-    float x = filterRadius*oneOverTargetSize.x;
-    float y = filterRadius*oneOverTargetSize.y;
+    float x = filterRadius*oneOverTargetSize.x*pow(0.5, mipId);
+    float y = filterRadius*oneOverTargetSize.y*pow(0.5, mipId);
   
-    float3 a = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y + y, 0, mipId)).rgb;
-    float3 b = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x,     IN.uv1.y + y, 0, mipId)).rgb;
-    float3 c = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y + y, 0, mipId)).rgb;
+    float3 a = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x - x, IN.uv0.y + y, 0, mipId)).rgb;
+    float3 b = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x,     IN.uv0.y + y, 0, mipId)).rgb;
+    float3 c = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x + x, IN.uv0.y + y, 0, mipId)).rgb;
   
-    float3 d = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y, 0, mipId)).rgb;
-    float3 e = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x,     IN.uv1.y, 0, mipId)).rgb;
-    float3 f = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y, 0, mipId)).rgb;
+    float3 d = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x - x, IN.uv0.y, 0, mipId)).rgb;
+    float3 e = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x,     IN.uv0.y, 0, mipId)).rgb;
+    float3 f = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x + x, IN.uv0.y, 0, mipId)).rgb;
 
-    float3 g = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y - y, 0, mipId)).rgb;
-    float3 h = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x,     IN.uv1.y - y, 0, mipId)).rgb;
-    float3 i = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y - y, 0, mipId)).rgb;
+    float3 g = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x - x, IN.uv0.y - y, 0, mipId)).rgb;
+    float3 h = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x,     IN.uv0.y - y, 0, mipId)).rgb;
+    float3 i = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv0.x + x, IN.uv0.y - y, 0, mipId)).rgb;
   
     upSample.rgb = e*4.0;
     upSample.rgb += (b+d+f+h)*2.0;
@@ -55,6 +55,8 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0
     upSample.a = 1.0;
     finalOut += upSample;
  } 
+ finalOut /= mipCount0;
  finalOut.a = 1.0;
-  return float4(finalOut.r,0,0,1);
+   
+  return float4(finalOut.rgb,1);
 }