Kaynağa Gözat

Add MeshBatchAccess
Remove shadows from pbr forward

ShiroSmith 4 yıl önce
ebeveyn
işleme
c61893fecb

+ 29 - 2
h3d/scene/MeshBatch.hx

@@ -1,5 +1,7 @@
 package h3d.scene;
 
+import hxsl.ShaderList;
+
 private class BatchData {
 
 	public var count : Int;
@@ -16,6 +18,10 @@ private class BatchData {
 
 }
 
+interface MeshBatchAccess {
+	var perInstance : Bool;
+}
+
 /**
 	h3d.scene.MeshBatch allows to draw multiple meshed in a single draw call.
 	See samples/MeshBatch.hx for an example.
@@ -90,8 +96,29 @@ class MeshBatch extends Mesh {
 
 			var manager = cast(ctx,h3d.pass.Default).manager;
 			var shaders = p.getShadersRec();
-			var rt = manager.compileShaders(shaders,false);
 
+			// Keep only batched shader
+			var batchShaders : ShaderList = shaders;
+			var prev = null;
+			var cur = batchShaders;
+			while( cur != null ) {
+				if( Std.isOfType(cur.s, MeshBatchAccess) ) {
+					var access : MeshBatchAccess = cast cur.s;
+					if( !access.perInstance ) {
+						if( prev != null ) 
+							prev.next = cur.next;
+						else 
+							batchShaders = cur.next;	
+						cur = cur.next;
+					}
+				}
+				else {
+					prev = cur;
+					cur = cur.next;
+				}
+			}
+
+			var rt = manager.compileShaders(batchShaders, false);
 			var shader = manager.shaderCache.makeBatchShader(rt);
 
 			var b = new BatchData();
@@ -124,7 +151,7 @@ class MeshBatch extends Mesh {
 			b.next = dataPasses;
 			dataPasses = b;
 
-			var sl = shaders;
+			var sl = batchShaders;
 			while( sl != null ) {
 				b.shaders.push(sl.s);
 				sl = sl.next;

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

@@ -5,8 +5,8 @@ class LightBuffer {
 	public var defaultForwardShader = new h3d.shader.pbr.DefaultForward();
 
 	var MAX_DIR_LIGHT = 2;
-	var MAX_SPOT_LIGHT = 3;
-	var MAX_POINT_LIGHT = 3;
+	var MAX_SPOT_LIGHT = 6;
+	var MAX_POINT_LIGHT = 6;
 
 	var lightInfos : hxd.FloatBuffer;
 	final POINT_LIGHT_INFO_SIZE = 3;
@@ -43,12 +43,12 @@ class LightBuffer {
 		s.spotLightCount = defaultForwardShader.spotLightCount;
 		s.dirLightCount = defaultForwardShader.dirLightCount;
 
-		for( i in 0 ... s.pointLightCount )
+		/*for( i in 0 ... s.pointLightCount )
 			s.pointShadowMaps[i] = defaultForwardShader.pointShadowMaps[i];
 		for( i in 0 ... s.spotLightCount )
 			s.spotShadowMaps[i] = defaultForwardShader.spotShadowMaps[i];
 		for( i in 0 ... s.dirLightCount )
-			s.dirShadowMaps[i] = defaultForwardShader.dirShadowMaps[i];
+			s.dirShadowMaps[i] = defaultForwardShader.dirShadowMaps[i];*/
 
 		s.USE_INDIRECT = defaultForwardShader.USE_INDIRECT;
 		if( s.USE_INDIRECT > 0.0 ) {
@@ -105,14 +105,14 @@ class LightBuffer {
 				fillVector(lightInfos, pbr.lightColor, i);
 				lightInfos[i+3] = (dl.shadows != null && dl.shadows.mode != None) ? 1.0 : -1.0;
 				fillVector(lightInfos, pbr.lightDir, i+4);
-				if( lightInfos[i+3] > 0 ) {
+				/*if( lightInfos[i+3] > 0 ) {
 					lightInfos[i+7] = dl.shadows.bias;
 					s.dirShadowMaps[li] = dl.shadows.getShadowTex();
 					var mat = dl.shadows.getShadowProj();
 					fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+8);
 					fillFloats(lightInfos, mat._12, mat._22, mat._32, mat._42, i+12);
 					fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+16);
-				}
+				}*/
 				s.dirLightCount++;
 			}
 
@@ -129,10 +129,10 @@ class LightBuffer {
 				lightInfos[i+7] = pbr.invLightRange4;
 				lightInfos[i+8] = pl.range;
 				lightInfos[i+9] = (pl.shadows != null && pl.shadows.mode != None) ? 1.0 : -1.0;
-				if( lightInfos[i+9] > 0 ) {
+				/*if( lightInfos[i+9] > 0 ) {
 					lightInfos[i+10] = pl.shadows.bias;
 					s.pointShadowMaps[li] = pl.shadows.getShadowTex();
-				}
+				}*/
 				s.pointLightCount++;
 			}
 
@@ -151,7 +151,7 @@ class LightBuffer {
 				lightInfos[i+12] = pbr.angle;
 				lightInfos[i+13] = pbr.fallOff;
 				lightInfos[i+14] = (sl.shadows != null && sl.shadows.mode != None) ? 1.0 : -1.0;
-				if( lightInfos[i+14] > 0 ) {
+				/*if( lightInfos[i+14] > 0 ) {
 					lightInfos[i+15] = sl.shadows.bias;
 					var mat = sl.shadows.getShadowProj();
 					fillFloats(lightInfos, mat._11, mat._21, mat._31, mat._41, i+16);
@@ -159,7 +159,7 @@ class LightBuffer {
 					fillFloats(lightInfos, mat._13, mat._23, mat._33, mat._43, i+24);
 					fillFloats(lightInfos, mat._14, mat._24, mat._34, mat._44, i+28);
 					s.spotShadowMaps[li] = sl.shadows.getShadowTex();
-				}
+				}*/
 				s.spotLightCount++;
 			}
 

+ 1 - 1
h3d/scene/pbr/Renderer.hx

@@ -133,7 +133,7 @@ class Renderer extends h3d.scene.Renderer {
 
 	override function getPassByName(name:String):h3d.pass.Base {
 		switch( name ) {
-		case "overlay", "beforeTonemapping", "albedo", "afterTonemapping":
+		case "overlay", "beforeTonemapping", "albedo", "afterTonemapping", "forward":
 			return defaultPass;
 		case "default", "alpha", "additive":
 			return output;

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

@@ -14,16 +14,16 @@ class DefaultForward extends hxsl.Shader {
 		@param var lightInfos : Buffer<Vec4, BUFFER_SIZE>;
 
 		// Buffer Info
-		@const(8) var dirLightCount : Int;
-		@const(8) var pointLightCount : Int;
-		@const(8) var spotLightCount : Int;
-		@const(8) var dirLightStride : Int;
-		@const(8) var pointLightStride : Int;
+		@param var dirLightCount : Int;
+		@param var pointLightCount : Int;
+		@param var spotLightCount : Int;
+		@param var dirLightStride : Int;
+		@param var pointLightStride : Int;
 
 		// ShadowMaps
-		@param var dirShadowMaps : Array<Sampler2D, 2>;
-		@param var pointShadowMaps : Array<SamplerCube, 3>;
-		@param var spotShadowMaps : Array<Sampler2D, 3>;
+		//@param var dirShadowMaps : Array<Sampler2D, 2>;
+		//@param var pointShadowMaps : Array<SamplerCube, 3>;
+		//@param var spotShadowMaps : Array<Sampler2D, 3>;
 
 		// Direct Lighting
 		@param var cameraPosition : Vec3;
@@ -111,14 +111,14 @@ class DefaultForward extends hxsl.Shader {
 
 			// Shadow
 			var shadow = 1.0;
-			if( hasShadowMap ) {
+			/*if( hasShadowMap ) {
 				var shadowBias = lightInfos[i+1].a;
 				var shadowProj = mat3x4(lightInfos[i+2], lightInfos[i+3], lightInfos[i+4]);
 				var shadowPos = transformedPosition * shadowProj;
 				var shadowUv = screenToUv(shadowPos.xy);
 				var depth = dirShadowMaps[index].get(shadowUv.xy).r;
 				shadow = (shadowPos.z - shadowBias > depth) ? 0.0 : 1.0;
-			}
+			}*/
 
 			return directLighting(lightColor, lightDir) * shadow;
 		}
@@ -135,14 +135,14 @@ class DefaultForward extends hxsl.Shader {
 
 			// Shadow
 			var shadow = 1.0;
-			if( hasShadowMap ) {
+			/*if( hasShadowMap ) {
 				var shadowBias = lightInfos[i+2].b;
 				var posToLight = transformedPosition.xyz - lightPos;
 				var dir = normalize(posToLight.xyz);
 				var depth = pointShadowMaps[index].getLod(dir, 0).r * range;
 				var zMax = length(posToLight);
 				shadow = (zMax - shadowBias > depth) ? 0.0 : 1.0;
-			}
+			}*/
 
 			return directLighting(pointLightIntensity(delta, size, invRange4) * lightColor, delta.normalize()) * shadow;
 		}
@@ -161,7 +161,7 @@ class DefaultForward extends hxsl.Shader {
 
 			// Shadow
 			var shadow = 1.0;
-			if( hasShadowMap ) {
+			/*if( hasShadowMap ) {
 				var shadowBias = lightInfos[i+3].a;
 				var shadowProj = mat4(lightInfos[i+4], lightInfos[i+5], lightInfos[i+6], lightInfos[i+7]);
 				var shadowPos = vec4(transformedPosition, 1.0) * shadowProj;
@@ -169,7 +169,7 @@ class DefaultForward extends hxsl.Shader {
 				var shadowUv = screenToUv(shadowPos.xy);
 				var depth = spotShadowMaps[index].get(shadowUv.xy).r;
 				shadow = (shadowPos.z - shadowBias > depth) ? 0.0 : 1.0;
-			}
+			}*/
 
 			var fallOffInfo = spotLightIntensity(delta, lightDir, range, invRange4, fallOff, angle);
 			var fallOff = fallOffInfo.x;