Browse Source

[FORWARD PBR][SHADOWS] Dynamically change the number of shadow maps so it's not always its max.

clandrin 4 năm trước cách đây
mục cha
commit
6429ac49eb
2 tập tin đã thay đổi với 25 bổ sung25 xóa
  1. 13 13
      h3d/scene/pbr/LightBuffer.hx
  2. 12 12
      h3d/shader/pbr/DefaultForward.hx

+ 13 - 13
h3d/scene/pbr/LightBuffer.hx

@@ -7,7 +7,7 @@ class LightBuffer {
 	var MAX_DIR_LIGHT = 2;
 	var MAX_SPOT_LIGHT = 10;
 	var MAX_POINT_LIGHT = 10;
-	var MAX_DIR_SHADOW = 2;
+	var MAX_DIR_SHADOW = 1;
 	var MAX_SPOT_SHADOW = 3;
 	var MAX_POINT_SHADOW = 3;
 
@@ -40,9 +40,6 @@ class LightBuffer {
 		defaultForwardShader.BUFFER_SIZE = size;
 		defaultForwardShader.dirLightStride = DIR_LIGHT_INFO_SIZE * MAX_DIR_LIGHT;
 		defaultForwardShader.pointLightStride = POINT_LIGHT_INFO_SIZE * MAX_POINT_LIGHT;
-		defaultForwardShader.MAX_DIR_SHADOWS = MAX_DIR_SHADOW;
-		defaultForwardShader.MAX_POINT_SHADOWS = MAX_POINT_SHADOW;
-		defaultForwardShader.MAX_SPOT_SHADOWS = MAX_SPOT_SHADOW;
 	}
 
 	public function setBuffers( s : h3d.shader.pbr.DefaultForward ) {
@@ -56,15 +53,15 @@ class LightBuffer {
 		s.pointLightCount = defaultForwardShader.pointLightCount;
 		s.spotLightCount = defaultForwardShader.spotLightCount;
 		s.dirLightCount = defaultForwardShader.dirLightCount;
-		s.MAX_DIR_SHADOWS = MAX_DIR_SHADOW;
-		s.MAX_POINT_SHADOWS = MAX_POINT_SHADOW;
-		s.MAX_SPOT_SHADOWS = MAX_SPOT_SHADOW;
+		s.DIR_SHADOW_COUNT = defaultForwardShader.DIR_SHADOW_COUNT;
+		s.POINT_SHADOW_COUNT = defaultForwardShader.POINT_SHADOW_COUNT;
+		s.SPOT_SHADOW_COUNT = defaultForwardShader.SPOT_SHADOW_COUNT;
 
-		for( i in 0 ... MAX_POINT_SHADOW )
+		for( i in 0 ... defaultForwardShader.POINT_SHADOW_COUNT )
 			s.pointShadowMaps[i] = defaultForwardShader.pointShadowMaps[i];
-		for( i in 0 ... MAX_SPOT_SHADOW )
+		for( i in 0 ... defaultForwardShader.SPOT_SHADOW_COUNT )
 			s.spotShadowMaps[i] = defaultForwardShader.spotShadowMaps[i];
-		for( i in 0 ... MAX_DIR_SHADOW )
+		for( i in 0 ... defaultForwardShader.DIR_SHADOW_COUNT )
 			s.dirShadowMaps[i] = defaultForwardShader.dirShadowMaps[i];
 
 		s.USE_INDIRECT = defaultForwardShader.USE_INDIRECT;
@@ -299,9 +296,12 @@ class LightBuffer {
 			lightInfos[i+14] = -1.0;
 		}
 
-		s.dirLightCount = dirLights.length + dirLightsShadow.length;
-		s.pointLightCount = pointLights.length + pointLightsShadow.length;
-		s.spotLightCount = spotLights.length + spotLightsShadow.length;
+		s.dirLightCount = dirLights.length;
+		s.pointLightCount = pointLights.length;
+		s.spotLightCount = spotLights.length;
+		s.DIR_SHADOW_COUNT = dirLightsShadow.length;
+		s.POINT_SHADOW_COUNT = pointLightsShadow.length;
+		s.SPOT_SHADOW_COUNT = spotLightsShadow.length;
 		s.lightInfos.uploadVector(lightInfos, 0, s.lightInfos.vertices, 0);
 
 		var pbrIndirect = @:privateAccess pbrRenderer.pbrIndirect;

+ 12 - 12
h3d/shader/pbr/DefaultForward.hx

@@ -4,9 +4,9 @@ class DefaultForward extends hxsl.Shader {
 
 	static var SRC = {
 
-		@const(16) var MAX_DIR_SHADOWS:Int;
-		@const(16) var MAX_POINT_SHADOWS:Int;
-		@const(16) var MAX_SPOT_SHADOWS:Int;
+		@const(16) var DIR_SHADOW_COUNT:Int;
+		@const(16) var POINT_SHADOW_COUNT:Int;
+		@const(16) var SPOT_SHADOW_COUNT:Int;
 
 		@:import h3d.shader.pbr.Light.LightEvaluation;
 		@:import h3d.shader.pbr.BDRF;
@@ -25,9 +25,9 @@ class DefaultForward extends hxsl.Shader {
 		@param var pointLightStride : Int;
 
 		// ShadowMaps
-		@param var dirShadowMaps : Array<Sampler2D, MAX_DIR_SHADOWS>;
-		@param var pointShadowMaps : Array<SamplerCube, MAX_POINT_SHADOWS>;
-		@param var spotShadowMaps : Array<Sampler2D, MAX_SPOT_SHADOWS>;
+		@param var dirShadowMaps : Array<Sampler2D, DIR_SHADOW_COUNT>;
+		@param var pointShadowMaps : Array<SamplerCube, POINT_SHADOW_COUNT>;
+		@param var spotShadowMaps : Array<Sampler2D, SPOT_SHADOW_COUNT>;
 
 		// Direct Lighting
 		@param var cameraPosition : Vec3;
@@ -197,24 +197,24 @@ class DefaultForward extends hxsl.Shader {
 			F0 = mix(pbrSpecularColor, albedoGamma, metalness);
 
 			// Dir Light With Shadow
-			@unroll for( l in 0 ... MAX_DIR_SHADOWS )
+			@unroll for( l in 0 ... DIR_SHADOW_COUNT )
 				lightAccumulation += evaluateDirLight(l) * evaluateDirShadow(l);
 			// Dir Light
-			@unroll for( l in MAX_DIR_SHADOWS ... dirLightCount + MAX_DIR_SHADOWS )
+			@unroll for( l in DIR_SHADOW_COUNT ... dirLightCount + DIR_SHADOW_COUNT )
 				lightAccumulation += evaluateDirLight(l);
 
 			// Point Light With Shadow
-			@unroll for( l in 0 ... MAX_POINT_SHADOWS )
+			@unroll for( l in 0 ... POINT_SHADOW_COUNT )
 				lightAccumulation += evaluatePointLight(l) * evaluatePointShadow(l);
 			// Point Light
-			@unroll for( l in MAX_POINT_SHADOWS ... pointLightCount + MAX_POINT_SHADOWS )
+			@unroll for( l in POINT_SHADOW_COUNT ... pointLightCount + POINT_SHADOW_COUNT )
 				lightAccumulation += evaluatePointLight(l);
 
 			// Spot Light With Shadow
-			@unroll for( l in 0 ... MAX_SPOT_SHADOWS )
+			@unroll for( l in 0 ... SPOT_SHADOW_COUNT )
 				lightAccumulation += evaluateSpotLight(l) * evaluateSpotShadow(l);
 			// Spot Light
-			@unroll for( l in MAX_SPOT_SHADOWS ... spotLightCount + MAX_SPOT_SHADOWS )
+			@unroll for( l in SPOT_SHADOW_COUNT ... spotLightCount + SPOT_SHADOW_COUNT )
 				lightAccumulation += evaluateSpotLight(l);
 
 			// Indirect only support the main env from the scene at the moment