Răsfoiți Sursa

Bugfix: Significantly reduced flickering artifacts due SSR sampling
- Temporal filtering now filters alpha values as well, ensuring SSR contribution is now faded in/out smoothly
- Resolved an issue where SSR rays that reached the depth range would count as successful hits
- Modified cubemap gen code so the orientation is correct
- Fixed a another crash due to shadowed light counting

BearishSun 8 ani în urmă
părinte
comite
1517308b3b
69 a modificat fișierele cu 86 adăugiri și 69 ștergeri
  1. BIN
      Data/Engine/Includes/RayMarch.bslinc.asset
  2. BIN
      Data/Engine/Includes/ReflectionCubemapCommon.bslinc.asset
  3. BIN
      Data/Engine/Includes/TemporalResolve.bslinc.asset
  4. BIN
      Data/Engine/Shaders/IrradianceComputeSH.bsl.asset
  5. BIN
      Data/Engine/Shaders/IrradianceComputeSH_1.bsl.asset
  6. BIN
      Data/Engine/Shaders/IrradianceEvaluate.bsl.asset
  7. BIN
      Data/Engine/Shaders/IrradianceEvaluate_1.bsl.asset
  8. BIN
      Data/Engine/Shaders/IrradianceEvaluate_2.bsl.asset
  9. BIN
      Data/Engine/Shaders/IrradianceEvaluate_3.bsl.asset
  10. BIN
      Data/Engine/Shaders/IrradianceEvaluate_4.bsl.asset
  11. BIN
      Data/Engine/Shaders/IrradianceEvaluate_5.bsl.asset
  12. BIN
      Data/Engine/Shaders/IrradianceProjectSH.bsl.asset
  13. BIN
      Data/Engine/Shaders/IrradianceReduceSH.bsl.asset
  14. BIN
      Data/Engine/Shaders/IrradianceReduceSH_1.bsl.asset
  15. BIN
      Data/Engine/Shaders/LightGridLLCreation.bsl.asset
  16. BIN
      Data/Engine/Shaders/PPBuildHiZ.bsl.asset
  17. BIN
      Data/Engine/Shaders/PPSSRResolve.bsl.asset
  18. BIN
      Data/Engine/Shaders/PPSSRResolve_1.bsl.asset
  19. BIN
      Data/Engine/Shaders/PPSSRTrace.bsl.asset
  20. BIN
      Data/Engine/Shaders/PPSSRTrace_1.bsl.asset
  21. BIN
      Data/Engine/Shaders/PPSSRTrace_10.bsl.asset
  22. BIN
      Data/Engine/Shaders/PPSSRTrace_11.bsl.asset
  23. BIN
      Data/Engine/Shaders/PPSSRTrace_12.bsl.asset
  24. BIN
      Data/Engine/Shaders/PPSSRTrace_13.bsl.asset
  25. BIN
      Data/Engine/Shaders/PPSSRTrace_14.bsl.asset
  26. BIN
      Data/Engine/Shaders/PPSSRTrace_2.bsl.asset
  27. BIN
      Data/Engine/Shaders/PPSSRTrace_3.bsl.asset
  28. BIN
      Data/Engine/Shaders/PPSSRTrace_4.bsl.asset
  29. BIN
      Data/Engine/Shaders/PPSSRTrace_5.bsl.asset
  30. BIN
      Data/Engine/Shaders/PPSSRTrace_6.bsl.asset
  31. BIN
      Data/Engine/Shaders/PPSSRTrace_7.bsl.asset
  32. BIN
      Data/Engine/Shaders/PPSSRTrace_8.bsl.asset
  33. BIN
      Data/Engine/Shaders/PPSSRTrace_9.bsl.asset
  34. BIN
      Data/Engine/Shaders/ReflectionCubeDownsample.bsl.asset
  35. BIN
      Data/Engine/Shaders/ReflectionCubeImportanceSample.bsl.asset
  36. BIN
      Data/Engine/Shaders/ShadowProject.bsl.asset
  37. BIN
      Data/Engine/Shaders/ShadowProject_1.bsl.asset
  38. BIN
      Data/Engine/Shaders/ShadowProject_10.bsl.asset
  39. BIN
      Data/Engine/Shaders/ShadowProject_11.bsl.asset
  40. BIN
      Data/Engine/Shaders/ShadowProject_12.bsl.asset
  41. BIN
      Data/Engine/Shaders/ShadowProject_13.bsl.asset
  42. BIN
      Data/Engine/Shaders/ShadowProject_14.bsl.asset
  43. BIN
      Data/Engine/Shaders/ShadowProject_15.bsl.asset
  44. BIN
      Data/Engine/Shaders/ShadowProject_2.bsl.asset
  45. BIN
      Data/Engine/Shaders/ShadowProject_3.bsl.asset
  46. BIN
      Data/Engine/Shaders/ShadowProject_4.bsl.asset
  47. BIN
      Data/Engine/Shaders/ShadowProject_5.bsl.asset
  48. BIN
      Data/Engine/Shaders/ShadowProject_6.bsl.asset
  49. BIN
      Data/Engine/Shaders/ShadowProject_7.bsl.asset
  50. BIN
      Data/Engine/Shaders/ShadowProject_8.bsl.asset
  51. BIN
      Data/Engine/Shaders/ShadowProject_9.bsl.asset
  52. BIN
      Data/Engine/Shaders/TiledDeferredImageBasedLighting.bsl.asset
  53. BIN
      Data/Engine/Shaders/TiledDeferredImageBasedLighting_1.bsl.asset
  54. BIN
      Data/Engine/Shaders/TiledDeferredImageBasedLighting_2.bsl.asset
  55. BIN
      Data/Engine/Shaders/TiledDeferredImageBasedLighting_3.bsl.asset
  56. BIN
      Data/Engine/Shaders/TiledDeferredLighting.bsl.asset
  57. BIN
      Data/Engine/Shaders/TiledDeferredLighting_1.bsl.asset
  58. BIN
      Data/Engine/Shaders/TiledDeferredLighting_2.bsl.asset
  59. BIN
      Data/Engine/Shaders/TiledDeferredLighting_3.bsl.asset
  60. BIN
      Data/Engine/Shaders/Transparent.bsl.asset
  61. 1 1
      Data/Raw/Engine/Includes/RayMarch.bslinc
  62. 3 2
      Data/Raw/Engine/Includes/ReflectionCubemapCommon.bslinc
  63. 60 37
      Data/Raw/Engine/Includes/TemporalResolve.bslinc
  64. 2 9
      Data/Raw/Engine/Shaders/PPSSRResolve.bsl
  65. 3 5
      Data/Raw/Engine/Shaders/PPSSRTrace.bsl
  66. 1 1
      Source/BansheeCore/Renderer/BsSkybox.cpp
  67. 7 7
      Source/BansheeFreeImgImporter/BsFreeImgImporter.cpp
  68. 8 6
      Source/RenderBeast/BsLightRendering.cpp
  69. 1 1
      Source/RenderBeast/BsRenderCompositor.cpp

BIN
Data/Engine/Includes/RayMarch.bslinc.asset


BIN
Data/Engine/Includes/ReflectionCubemapCommon.bslinc.asset


BIN
Data/Engine/Includes/TemporalResolve.bslinc.asset


BIN
Data/Engine/Shaders/IrradianceComputeSH.bsl.asset


BIN
Data/Engine/Shaders/IrradianceComputeSH_1.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate_1.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate_2.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate_3.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate_4.bsl.asset


BIN
Data/Engine/Shaders/IrradianceEvaluate_5.bsl.asset


BIN
Data/Engine/Shaders/IrradianceProjectSH.bsl.asset


BIN
Data/Engine/Shaders/IrradianceReduceSH.bsl.asset


BIN
Data/Engine/Shaders/IrradianceReduceSH_1.bsl.asset


BIN
Data/Engine/Shaders/LightGridLLCreation.bsl.asset


BIN
Data/Engine/Shaders/PPBuildHiZ.bsl.asset


BIN
Data/Engine/Shaders/PPSSRResolve.bsl.asset


BIN
Data/Engine/Shaders/PPSSRResolve_1.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_1.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_10.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_11.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_12.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_13.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_14.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_2.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_3.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_4.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_5.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_6.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_7.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_8.bsl.asset


BIN
Data/Engine/Shaders/PPSSRTrace_9.bsl.asset


BIN
Data/Engine/Shaders/ReflectionCubeDownsample.bsl.asset


BIN
Data/Engine/Shaders/ReflectionCubeImportanceSample.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_1.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_10.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_11.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_12.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_13.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_14.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_15.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_2.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_3.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_4.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_5.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_6.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_7.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_8.bsl.asset


BIN
Data/Engine/Shaders/ShadowProject_9.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredImageBasedLighting.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredImageBasedLighting_1.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredImageBasedLighting_2.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredImageBasedLighting_3.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredLighting.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredLighting_1.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredLighting_2.bsl.asset


BIN
Data/Engine/Shaders/TiledDeferredLighting_3.bsl.asset


BIN
Data/Engine/Shaders/Transparent.bsl.asset


+ 1 - 1
Data/Raw/Engine/Includes/RayMarch.bslinc

@@ -80,7 +80,7 @@ mixin RayMarch
 			D.x = abs(D.x) < 0.00001f ? 0.00001f : D.x;
 			D.y = abs(D.y) < 0.00001f ? 0.00001f : D.y;
 
-			while(rayPos.z <= 1.0f && iterationCount < MAX_HIZ_ITERATIONS)
+			while(rayPos.z < 0.9999f && iterationCount < MAX_HIZ_ITERATIONS)
 			{
 				// Get depth of the current cell
 				float cellZ = depth.SampleLevel(samp, rayPos.xy, mipLevel).r;

+ 3 - 2
Data/Raw/Engine/Includes/ReflectionCubemapCommon.bslinc

@@ -5,10 +5,11 @@ mixin ReflectionCubemapCommon
 		float3 getDirFromCubeFace(uint cubeFace, float2 uv)
 		{
 			float3 dir;
+			
 			if(cubeFace == 0)
-				dir = float3(1.0f, -uv.y, -uv.x);
-			else if(cubeFace == 1)
 				dir = float3(-1.0f, -uv.y, uv.x);
+			else if(cubeFace == 1)
+				dir = float3(1.0f, -uv.y, -uv.x);
 			else if(cubeFace == 2)
 				dir = float3(uv.x, 1.0f, uv.y);
 			else if(cubeFace == 3)

+ 60 - 37
Data/Raw/Engine/Includes/TemporalResolve.bslinc

@@ -64,7 +64,7 @@ mixin TemporalResolve
 		#ifndef TEMPORAL_GREEN_AS_LUMA
 			#define TEMPORAL_GREEN_AS_LUMA 0
 		#endif
-		
+				
 		// When enabled the input samples will be tonemapped using the provided exposure value. Once the final
 		// value is resolved, it will be scaled back into original range. This ensures high frequency data from
 		// HDR content is removed, as it would cause aliasing otherwise. We scale the result back into high range
@@ -115,8 +115,10 @@ mixin TemporalResolve
 			#define _TEX2D(n) Texture2DMS<float> n
 			#if MSAA_COLOR
 				#define _TEXCOLOR(n) Texture2DMS<float4> n
+				#define _PTEXCOLOR(n) n
 			#else
 				#define _TEXCOLOR(n) Texture2D n, SamplerState n##SampState, float2 n##TexelSize
+				#define _PTEXCOLOR(n) n, n##SampState, n##TexelSize
 			#endif
 			
 			#define _PTEX2D(n) n
@@ -134,6 +136,7 @@ mixin TemporalResolve
 			#define _TEX2D(n) Texture2D n, SamplerState n##SampState, float2 n##TexelSize
 			#define _TEXCOLOR(n) _TEX2D(n)
 			#define _PTEX2D(n) n, n##SampState, n##TexelSize
+			#define _PTEXCOLOR(n) n, n##SampState, n##TexelSize
 			#define _SAMPLE(n, uv) n.Sample(n##SampState, uv)
 			#define _SAMPLEOFF(n, uv, offset) n.Sample(n##SampState, uv, offset)
 			#define _SAMPLECOL(n, uv, offset) _SAMPLEOFF(n, uv, offset)
@@ -193,7 +196,7 @@ mixin TemporalResolve
 			return float3(uv + dmin.xy * _PIXSIZE(sceneDepth), dmin.z);
 		}
 		
-		float3 clipAABB(float3 boxMin, float3 boxMax, float3 history, float3 current)
+		float clipAABB(float3 boxMin, float3 boxMax, float3 history, float3 current)
 		{
 			// Note: Is this necessary? Will "current" always be in the box?
 			boxMin = min(current, boxMin);
@@ -209,8 +212,7 @@ mixin TemporalResolve
 			float3 tNeg = (extents - origin) * rDir;
 			float3 tPos = (-extents - origin) * rDir;
 			
-			float t = saturate(max(max(min(tNeg.x, tPos.x), min(tNeg.y, tPos.y)), min(tNeg.z, tPos.z)));
-			return history + t * dir;
+			return saturate(max(max(min(tNeg.x, tPos.x), min(tNeg.y, tPos.y)), min(tNeg.z, tPos.z)));
 		}
 		
 		// Encodes velocity into a format suitable for storing in a 16-bit SNORM texture. 
@@ -241,13 +243,34 @@ mixin TemporalResolve
 			#define _TONEMAP_COLOR(v) v
 		#endif // TEMPORAL_TONEMAP
 		
-		// Automatically convert from/to YCoCg space, if enabled
-		#if TEMPORAL_YCOCG
-			#define _SAMPLE_COLOR(n, uv, offset) _TONEMAP_COLOR(RGBToYCoCg(_SAMPLECOL(n, uv, offset).rgb))
-		#else // TEMPORAL_YCOCG
-			#define _SAMPLE_COLOR(n, uv, offset) _TONEMAP_COLOR(_SAMPLECOL(n, uv, offset).rgb)
-		#endif // TEMPORAL_YCOCG
-						
+		// Samples the scene color texture, automatically converting to YCoCg space (if enabled),
+		// and tonemapping the value
+		float4 sampleColor(
+			_TEXCOLOR(tex), 
+			float2 uv, 
+			int2 offset
+			#if TEMPORAL_TONEMAP
+			, float exposureScale
+			#endif // TEMPORAL_TONEMAP
+		)
+		{
+			float4 color = _SAMPLECOL(tex, uv, offset);
+			
+			#if TEMPORAL_YCOCG
+				color.rgb = _TONEMAP_COLOR(RGBToYCoCg(color.rgb));
+			#else
+				color.rgb = _TONEMAP_COLOR(color.rgb);
+			#endif
+			
+			return color;
+		}
+		
+		#if TEMPORAL_TONEMAP
+			#define _SAMPLE_COLOR(n, uv, offset) sampleColor(_PTEXCOLOR(n), uv, offset, exposureScale)
+		#else
+			#define _SAMPLE_COLOR(n, uv, offset) sampleColor(_PTEXCOLOR(n), uv, offset)
+		#endif
+		
 		///////////////////////////// MAIN /////////////////////////////////
 		[internal]
 		cbuffer TemporalInput
@@ -256,7 +279,7 @@ mixin TemporalResolve
 			float gSampleWeightsLowpass[9];
 		}
 		
-		float3 temporalResolve(
+		float4 temporalResolve(
 			_TEX2D(sceneDepth), 
 			_TEXCOLOR(sceneColor), 
 			_TEXCOLOR(prevColor), 
@@ -322,28 +345,28 @@ mixin TemporalResolve
 			
 			#if TEMPORAL_YCOCG
 			// YCOCG only requires a + pattern for good quality
-			float3 neighbor[5];
+			float4 neighbor[5];
 			neighbor[0] = _SAMPLE_COLOR(sceneColor, uvColor, int2(-1,  0));
 			neighbor[1] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 0, -1));
 			neighbor[2] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 0,  0));
 			neighbor[3] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 1,  0));
 			neighbor[4] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 0,  1));
 			
-			float3 filtered = 0;
+			float4 filtered = 0;
 			[unroll]
 			for(uint i = 0; i < 5; ++i)
 				filtered += neighbor[i] * gSampleWeights[i];
 			
-			float3 filteredLow = filtered;
+			float4 filteredLow = filtered;
 			
-			float3 neighborMin = min(min(min(neighbor[0], neighbor[1]), min(neighbor[2], neighbor[3])), 
+			float4 neighborMin = min(min(min(neighbor[0], neighbor[1]), min(neighbor[2], neighbor[3])), 
 				neighbor[4]);
 				
-			float3 neighborMax = max(max(max(neighbor[0], neighbor[1]), max(neighbor[2], neighbor[3])), 
+			float4 neighborMax = max(max(max(neighbor[0], neighbor[1]), max(neighbor[2], neighbor[3])), 
 				neighbor[4]);
 			
 			#else // TEMPORAL_YCOCG
-			float3 neighbor[9];
+			float4 neighbor[9];
 			neighbor[0] = _SAMPLE_COLOR(sceneColor, uvColor, int2(-1, -1));
 			neighbor[1] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 0, -1));
 			neighbor[2] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 1, -1));
@@ -354,47 +377,47 @@ mixin TemporalResolve
 			neighbor[7] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 0,  1));
 			neighbor[8] = _SAMPLE_COLOR(sceneColor, uvColor, int2( 1,  1));
 			
-			float3 filtered = 0;
+			float4 filtered = 0;
 			[unroll]
 			for(uint i = 0; i < 9; ++i)
 				filtered += neighbor[i] * gSampleWeights[i];
 
 			#if TEMPORAL_LOWPASS
-				float3 filteredLow = 0;
+				float4 filteredLow = 0;
 				[unroll]
 				for(uint i = 0; i < 9; ++i)
 					filteredLow += neighbor[i] * gSampleWeightsLowpass[i];
 			#else
-				float3 filteredLow = filtered;
+				float4 filteredLow = filtered;
 			#endif // TEMPORAL_LOWPASS
 			
 			#if TEMPORAL_SMOOTH_NEIGHBORHOOD
 			// Calculate standard deviation and determine neighborhood min/max based on it
-			float3 mean = 0;
+			float4 mean = 0;
 			[unroll]
 			for(uint i = 0; i < 9; ++i)
 				mean += neighbor[i];
 			
 			mean /= 9.0f;
 			
-			float3 meanSqrd = 0;
+			float4 meanSqrd = 0;
 			[unroll]
 			for(uint i = 0; i < 9; ++i)
 				meanSqrd += neighbor[i] * neighbor[i];
 			
 			meanSqrd /= 9.0f;
 			
-			float3 stdDev = sqrt(abs(meanSqrd - mean * mean));
-			float3 neighborMin = mean - stdDev;
-			float3 neighborMax = mean + stdDev;
+			float4 stdDev = sqrt(abs(meanSqrd - mean * mean));
+			float4 neighborMin = mean - stdDev;
+			float4 neighborMax = mean + stdDev;
 			
 			#else // TEMPORAL_SMOOTH_NEIGHBORHOOD
-			float3 neighborMin = min(min(
+			float4 neighborMin = min(min(
 				min(min(neighbor[0], neighbor[1]), min(neighbor[2], neighbor[3])), 
 				min(min(neighbor[4], neighbor[5]), min(neighbor[6], neighbor[7]))), 
 				neighbor[8]);
 				
-			float3 neighborMax = max(max(
+			float4 neighborMax = max(max(
 				max(max(neighbor[0], neighbor[1]), max(neighbor[2], neighbor[3])), 
 				max(max(neighbor[4], neighbor[5]), max(neighbor[6], neighbor[7]))), 
 				neighbor[8]);
@@ -403,7 +426,7 @@ mixin TemporalResolve
 			#endif // TEMPORAL_YCOCG
 			
 			/////////////////// GET PREVIOUS FRAME COLOR ///////////////////////
-			float3 prevColorVal = _SAMPLE_COLOR(prevColor, prevUV, int2(0, 0));
+			float4 prevColorVal = _SAMPLE_COLOR(prevColor, prevUV, int2(0, 0));
 			
 			///////////////////// CLAMP TO NEIGHBORHOOD ////////////////////////
 			// Clamping to neighborhood ensures we don't blend with values that are too
@@ -413,7 +436,8 @@ mixin TemporalResolve
 			#else // TEMPORAL_YCOCG
 				// Uses low-pass to reduce flickering
 				#if TEMPORAL_CLIP_AABB
-					prevColorVal = clipAABB(neighborMin, neighborMax, prevColorVal, filteredLow);
+					float clipT = clipAABB(neighborMin.rgb, neighborMax.rgb, prevColorVal.rgb, filteredLow.rgb);
+					prevColorVal = prevColorVal + clipT * (filteredLow - prevColorVal);
 				#else // TEMPORAL_CLIP_AABB
 					prevColorVal = clamp(prevColorVal, neighborMin, neighborMax);
 				#endif // TEMPORAL_CLIP_AABB
@@ -423,7 +447,7 @@ mixin TemporalResolve
 			// Find out how much impact should the previous frame's color have
 			#if TEMPORAL_BLEND_FACTOR // Fixed blend factor
 				float blendAmount = 1.0f / TEMPORAL_BLEND_FACTOR;
-				float3 output = lerp(prevColorVal, filtered, blendAmount);
+				float4 output = lerp(prevColorVal, filtered, blendAmount);
 			#else // TEMPORAL_BLEND_FACTOR
 				#if TEMPORAL_YCOCG
 					float lumaCurrent = filtered.r;
@@ -445,22 +469,22 @@ mixin TemporalResolve
 				float weightGood = 1.0f - 1.0f / TEMPORAL_GOOD_RETENTION;
 				
 				float blendAmount = lerp(weightBad, weightGood, blendWeight * blendWeight);
-				float3 output = lerp(filtered, prevColorVal, blendAmount);
+				float4 output = lerp(filtered, prevColorVal, blendAmount);
 			#endif // TEMPORAL_BLEND_FACTOR
 			
 			//////// UNDO TONEMAP & MOVE BACK TO RGB SPACE //////////////////////
 			#if TEMPORAL_TONEMAP
 				#if TEMPORAL_YCOCG
-					output = HDRScaleYInv(output, exposureScale);
+					output.rgb = HDRScaleYInv(output.rgb, exposureScale);
 				#elif TEMPORAL_GREEN_AS_LUMA
-					output = HDRScaleGInv(output, exposureScale);
+					output.rgb = HDRScaleGInv(output.rgb, exposureScale);
 				#else
-					output = HDRScaleRGBInv(output, exposureScale);
+					output.rgb = HDRScaleRGBInv(output.rgb, exposureScale);
 				#endif
 			#endif // TEMPORAL_TONEMAP
 			
 			#if TEMPORAL_YCOCG
-				output = YCoCgToRGB(output);
+				output.rgb = YCoCgToRGB(output.rgb);
 			#endif // TEMPORAL_YCOCG			
 			
 			// Note: Potential improvements:
@@ -478,7 +502,6 @@ mixin TemporalResolve
 		#undef _PIXSIZE
 		#undef _TONEMAP_COLOR
 		#undef _TONEMAP_COLOR_INV
-		#undef _SAMPLE_COLOR
 		#undef _RESOLVE_COLOR
 	};
 };

+ 2 - 9
Data/Raw/Engine/Shaders/PPSSRResolve.bsl

@@ -40,26 +40,19 @@ technique PPSSRResolve
 		
 		float4 fsmain(VStoFS input) : SV_Target0
 		{
-			float4 col;
 			#if MSAA
-				col.rgb = temporalResolve(
+				return temporalResolve(
 					gSceneDepth, 
 					gSceneColor, gLinearSampler, gSceneColorTexelSize, 
 					gPrevColor, gLinearSampler, gSceneColorTexelSize,
 					gManualExposure, input.uv0, input.screenPos, 0);
-					
-				col.a = gSceneColor.Sample(gLinearSampler, input.uv0 * gSceneColorTexelSize).a;
 			#else
-				col.rgb = temporalResolve(
+				return temporalResolve(
 					gSceneDepth, gPointSampler, gSceneDepthTexelSize,
 					gSceneColor, gLinearSampler, gSceneColorTexelSize, 
 					gPrevColor, gLinearSampler, gSceneColorTexelSize,
 					gManualExposure, input.uv0, input.screenPos, 0);
-					
-				col.a = gSceneColor.Sample(gLinearSampler, input.uv0).a;
 			#endif
-			
-			return col;
 		}	
 	};
 };

+ 3 - 5
Data/Raw/Engine/Shaders/PPSSRTrace.bsl

@@ -168,11 +168,9 @@ technique PPSSRTrace
 					sum += color * dirFade;
 				}
 			}
-			
-			// Divide by total number of rays, instead of actual number of rays that passed the test. This scales down the
-			// contribution for pixels for which many rays failed the test and might not be accurate.
-			float4 output = sum / NUM_RAYS; 
-			
+
+			float4 output = sum / NUM_RAYS;
+						
 			// Move back to high range (reverse tonemap)
 			output.rgb /= (1 - LuminanceRGB(output.rgb));
 			

+ 1 - 1
Source/BansheeCore/Renderer/BsSkybox.cpp

@@ -80,7 +80,7 @@ namespace bs
 			coreSkybox->mFilteredRadiance = coreFilteredRadiance;
 
 			// Generate irradiance
-			ct::gIBLUtility().filterCubemapForIrradiance(coreFilteredRadiance, coreIrradiance);
+			ct::gIBLUtility().filterCubemapForIrradiance(coreSkybox->getTexture(), coreIrradiance);
 			coreSkybox->mIrradiance = coreIrradiance;
 
 			return true;

+ 7 - 7
Source/BansheeFreeImgImporter/BsFreeImgImporter.cpp

@@ -519,7 +519,7 @@ namespace bs
 	{
 		Vector3 nrmDir = Vector3::normalize(dir);
 
-		float u = (atan2(nrmDir.z, nrmDir.x) + Math::PI) / Math::TWO_PI;
+		float u = (atan2(nrmDir.x, nrmDir.z) + Math::PI) / Math::TWO_PI;
 		float v = acos(nrmDir.y) / Math::PI;
 
 		return Vector2(u, v);
@@ -556,12 +556,12 @@ namespace bs
 		// coordinates are mapped.
 		static const RemapInfo remapLookup[] = 
 		{
-			{ 2, 1, 0, {  1.0f, -1.0f,  1.0f }}, // X+
-			{ 2, 1, 0, { -1.0f, -1.0f, -1.0f }}, // X-
-			{ 0, 2, 1, {  1.0f, -1.0f,  1.0f }}, // Y+
-			{ 0, 2, 1, {  1.0f,  1.0f, -1.0f }}, // Y-
-			{ 0, 1, 2, {  1.0f, -1.0f, -1.0f }}, // Z+
-			{ 0, 1, 2, { -1.0f, -1.0f,  1.0f }}  // Z-
+			{ 2, 1, 0, { -1.0f, -1.0f,  1.0f }}, // X+
+			{ 2, 1, 0, {  1.0f, -1.0f, -1.0f }}, // X-
+			{ 0, 2, 1, {  1.0f,  1.0f,  1.0f }}, // Y+
+			{ 0, 2, 1, {  1.0f, -1.0f, -1.0f }}, // Y-
+			{ 0, 1, 2, {  1.0f, -1.0f,  1.0f }}, // Z+
+			{ 0, 1, 2, { -1.0f, -1.0f, -1.0f }}  // Z-
 		};
 
 		float invSize = 1.0f / faceSize;

+ 8 - 6
Source/RenderBeast/BsLightRendering.cpp

@@ -173,7 +173,7 @@ namespace bs { namespace ct
 		auto partition = [](Vector<const RendererLight*>& entries)
 		{
 			UINT32 numUnshadowed = 0;
-			int first = 0;
+			int first = -1;
 			for (UINT32 i = 0; i < (UINT32)entries.size(); ++i)
 			{
 				if(entries[i]->internal->getCastsShadow())
@@ -185,13 +185,15 @@ namespace bs { namespace ct
 					++numUnshadowed;
 			}
 
-			for(UINT32 i = first + 1; i < (UINT32)entries.size(); ++i)
+			if(first != -1)
 			{
-				if(!entries[i]->internal->getCastsShadow())
+				for(UINT32 i = first + 1; i < (UINT32)entries.size(); ++i)
 				{
-					std::swap(entries[i], entries[first]);
-					++first;
-					++numUnshadowed;
+					if(!entries[i]->internal->getCastsShadow())
+					{
+						std::swap(entries[i], entries[first]);
+						++numUnshadowed;
+					}
 				}
 			}
 

+ 1 - 1
Source/RenderBeast/BsRenderCompositor.cpp

@@ -1875,7 +1875,7 @@ namespace bs { namespace ct
 			SPtr<RenderTexture> traceRt = RenderTexture::create(traceRtDesc);
 
 			rapi.setRenderTarget(traceRt, FBT_DEPTH | FBT_STENCIL, RT_DEPTH_STENCIL);
-			rapi.clearRenderTarget(FBT_COLOR);
+			rapi.clearRenderTarget(FBT_COLOR, Color::ZERO);
 
 			SSRTraceMat* traceMat = SSRTraceMat::getVariation(settings.quality, viewProps.numSamples > 1, true);
 			traceMat->execute(inputs.view, gbuffer, sceneColor, hiZ, settings, traceRt);