Преглед изворни кода

added "Background" sky mode, removed special shadowLight handling

ncannasse пре 7 година
родитељ
комит
829d1c3d63
3 измењених фајлова са 46 додато и 66 уклоњено
  1. 10 12
      h3d/scene/pbr/LightSystem.hx
  2. 27 52
      h3d/scene/pbr/Renderer.hx
  3. 9 2
      h3d/shader/pbr/Lighting.hx

+ 10 - 12
h3d/scene/pbr/LightSystem.hx

@@ -14,22 +14,20 @@ class LightSystem extends h3d.scene.LightSystem {
 	}
 	}
 
 
 	public function drawLights( r : h3d.scene.Renderer, lightPass : h3d.pass.ScreenFx<Dynamic> ) {
 	public function drawLights( r : h3d.scene.Renderer, lightPass : h3d.pass.ScreenFx<Dynamic> ) {
-		var light = @:privateAccess ctx.lights;
+		var plight = @:privateAccess ctx.lights;
 		var currentTarget = ctx.engine.getCurrentTarget();
 		var currentTarget = ctx.engine.getCurrentTarget();
 		var width = currentTarget == null ? ctx.engine.width : currentTarget.width;
 		var width = currentTarget == null ? ctx.engine.width : currentTarget.width;
 		var height = currentTarget == null ? ctx.engine.height : currentTarget.height;
 		var height = currentTarget == null ? ctx.engine.height : currentTarget.height;
-		while( light != null ) {
-			if( light != shadowLight ) {
-				var light = Std.instance(light, h3d.scene.pbr.Light);
-				if( light != null && light.primitive == null ) {
-					if( light.shadows.shader != null ) lightPass.addShader(light.shadows.shader);
-					lightPass.addShader(light.shader);
-					lightPass.render();
-					lightPass.removeShader(light.shader);
-					if( light.shadows.shader != null ) lightPass.removeShader(light.shadows.shader);
-				}
+		while( plight != null ) {
+			var light = Std.instance(plight, h3d.scene.pbr.Light);
+			if( light != null && light.primitive == null ) {
+				if( light.shadows.shader != null ) lightPass.addShader(light.shadows.shader);
+				lightPass.addShader(light.shader);
+				lightPass.render();
+				lightPass.removeShader(light.shader);
+				if( light.shadows.shader != null ) lightPass.removeShader(light.shadows.shader);
 			}
 			}
-			light = light.next;
+			plight = plight.next;
 		}
 		}
 	}
 	}
 }
 }

+ 27 - 52
h3d/scene/pbr/Renderer.hx

@@ -23,6 +23,7 @@ package h3d.scene.pbr;
 	var Hide = "Hide";
 	var Hide = "Hide";
 	var Env = "Env";
 	var Env = "Env";
 	var Irrad = "Irrad";
 	var Irrad = "Irrad";
+	var Background = "Background";
 }
 }
 
 
 @:enum abstract TonemapMap(String) {
 @:enum abstract TonemapMap(String) {
@@ -44,9 +45,7 @@ typedef RenderProps = {
 class Renderer extends h3d.scene.Renderer {
 class Renderer extends h3d.scene.Renderer {
 	var slides = new h3d.pass.ScreenFx(new h3d.shader.pbr.Slides());
 	var slides = new h3d.pass.ScreenFx(new h3d.shader.pbr.Slides());
 	var pbrOut = new h3d.pass.ScreenFx(new h3d.shader.ScreenShader());
 	var pbrOut = new h3d.pass.ScreenFx(new h3d.shader.ScreenShader());
-	var pbrOutIndirect = new h3d.pass.ScreenFx(new h3d.shader.ScreenShader());
 	var tonemap = new h3d.pass.ScreenFx(new h3d.shader.pbr.ToneMapping());
 	var tonemap = new h3d.pass.ScreenFx(new h3d.shader.pbr.ToneMapping());
-	var pbrSun = new h3d.shader.pbr.Light.DirLight();
 	var pbrLightPass : h3d.mat.Pass;
 	var pbrLightPass : h3d.mat.Pass;
 	var screenLightPass : h3d.pass.ScreenFx<h3d.shader.ScreenShader>;
 	var screenLightPass : h3d.pass.ScreenFx<h3d.shader.ScreenShader>;
 	var fxaa = new h3d.pass.FXAA();
 	var fxaa = new h3d.pass.FXAA();
@@ -54,7 +53,6 @@ class Renderer extends h3d.scene.Renderer {
 	var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
 	var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
 	var pbrProps = new h3d.shader.pbr.PropsImport();
 	var pbrProps = new h3d.shader.pbr.PropsImport();
 	var hasDebugEvent = false;
 	var hasDebugEvent = false;
-	var curDirShadow : hxsl.Shader;
 
 
 	public var skyMode : SkyMode = Hide;
 	public var skyMode : SkyMode = Hide;
 	public var toneMode : TonemapMap = Reinhard;
 	public var toneMode : TonemapMap = Reinhard;
@@ -80,13 +78,12 @@ class Renderer extends h3d.scene.Renderer {
 		super();
 		super();
 		this.env = env;
 		this.env = env;
 		defaultPass = new h3d.pass.Default("default");
 		defaultPass = new h3d.pass.Default("default");
-		pbrOut.addShader(pbrProps);
 		slides.addShader(pbrProps);
 		slides.addShader(pbrProps);
-		pbrOutIndirect.addShader(pbrIndirect);
-		pbrOutIndirect.addShader(pbrProps);
-		pbrOutIndirect.pass.setBlendMode(Add);
-		pbrOutIndirect.pass.stencil = new h3d.mat.Stencil();
-		pbrOutIndirect.pass.stencil.setOp(Keep, Keep, Keep);
+		pbrOut.addShader(pbrIndirect);
+		pbrOut.addShader(pbrProps);
+		pbrOut.pass.setBlendMode(Add);
+		pbrOut.pass.stencil = new h3d.mat.Stencil();
+		pbrOut.pass.stencil.setOp(Keep, Keep, Keep);
 		allPasses.push(output);
 		allPasses.push(output);
 		allPasses.push(defaultPass);
 		allPasses.push(defaultPass);
 		allPasses.push(decalsOutput);
 		allPasses.push(decalsOutput);
@@ -201,10 +198,7 @@ class Renderer extends h3d.scene.Renderer {
 		var hdr = allocTarget("hdrOutput", true, 1, RGBA16F);
 		var hdr = allocTarget("hdrOutput", true, 1, RGBA16F);
 		ctx.setGlobal("hdr", hdr);
 		ctx.setGlobal("hdr", hdr);
 		setTarget(hdr);
 		setTarget(hdr);
-		if( renderMode == LightProbe )
-			clear(0);
-		else if( ctx.engine.backgroundColor != null )
-			clear(ctx.engine.backgroundColor);
+		clear(0);
 
 
 		pbrProps.albedoTex = albedo;
 		pbrProps.albedoTex = albedo;
 		pbrProps.normalTex = normal;
 		pbrProps.normalTex = normal;
@@ -222,34 +216,6 @@ class Renderer extends h3d.scene.Renderer {
 		pbrIndirect.irrSpecular = env.specular;
 		pbrIndirect.irrSpecular = env.specular;
 		pbrIndirect.irrSpecularLevels = env.specLevels;
 		pbrIndirect.irrSpecularLevels = env.specLevels;
 
 
-		if( ls.shadowLight == null ) {
-			if( curDirShadow != null ) {
-				pbrOut.removeShader(curDirShadow);
-				curDirShadow = null;
-			}
-			pbrOut.removeShader(pbrDirect);
-			pbrOut.removeShader(pbrSun);
-		} else {
-			var pdir = Std.instance(ls.shadowLight, h3d.scene.pbr.DirLight);
-			var pshadow = @:privateAccess pdir == null ? null : pdir.shadows.shader;
-			if( pshadow != curDirShadow ) {
-				if( curDirShadow != null ) pbrOut.removeShader(curDirShadow);
-				curDirShadow = pshadow;
-				if( pshadow != null ) pbrOut.addShader(pshadow);
-			}
-			if( pbrOut.getShader(h3d.shader.pbr.Light.DirLight) == null ) {
-				pbrOut.addShader(pbrDirect);
-				pbrOut.addShader(pbrSun);
-			}
-			// works with both pre-pbr DirLight and pbr DirLight
-			pbrSun.lightColor.load(ls.shadowLight.color);
-			if( pdir != null ) pbrSun.lightColor.scale3(pdir.power * pdir.power);
-			pbrSun.lightDir.load(@:privateAccess ls.shadowLight.getShadowDirection());
-			pbrSun.lightDir.scale3(-1);
-			pbrSun.lightDir.normalize();
-		}
-
-		pbrOut.setGlobals(ctx);
 		pbrDirect.doDiscard = false;
 		pbrDirect.doDiscard = false;
 		pbrIndirect.cameraInvViewProj.load(ctx.camera.getInverseViewProj());
 		pbrIndirect.cameraInvViewProj.load(ctx.camera.getInverseViewProj());
 		switch( renderMode ) {
 		switch( renderMode ) {
@@ -257,7 +223,16 @@ class Renderer extends h3d.scene.Renderer {
 			pbrIndirect.drawIndirectDiffuse = true;
 			pbrIndirect.drawIndirectDiffuse = true;
 			pbrIndirect.drawIndirectSpecular= true;
 			pbrIndirect.drawIndirectSpecular= true;
 			pbrIndirect.showSky = skyMode != Hide;
 			pbrIndirect.showSky = skyMode != Hide;
-			pbrIndirect.skyMap = skyMode == Irrad ? env.diffuse : env.env;
+			pbrIndirect.skyColor = false;
+			pbrIndirect.skyMap = switch( skyMode ) {
+			case Hide: null;
+			case Env: env.env;
+			case Irrad: env.diffuse;
+			case Background:
+				pbrIndirect.skyColor = true;
+				pbrIndirect.skyColorValue.setColor(ctx.engine.backgroundColor);
+				null;
+			};
 		case LightProbe:
 		case LightProbe:
 			pbrIndirect.drawIndirectDiffuse = false;
 			pbrIndirect.drawIndirectDiffuse = false;
 			pbrIndirect.drawIndirectSpecular= false;
 			pbrIndirect.drawIndirectSpecular= false;
@@ -265,8 +240,6 @@ class Renderer extends h3d.scene.Renderer {
 			pbrIndirect.skyMap = env.env;
 			pbrIndirect.skyMap = env.env;
 		}
 		}
 
 
-		if( ls.shadowLight != null )
-			pbrOut.render();
 		pbrDirect.doDiscard = true;
 		pbrDirect.doDiscard = true;
 
 
 		var ls = Std.instance(ls, LightSystem);
 		var ls = Std.instance(ls, LightSystem);
@@ -285,7 +258,7 @@ class Renderer extends h3d.scene.Renderer {
 
 
 		if( renderMode == LightProbe ) {
 		if( renderMode == LightProbe ) {
 			pbrProps.isScreen = true;
 			pbrProps.isScreen = true;
-			pbrOutIndirect.render();
+			pbrOut.render();
 			resetTarget();
 			resetTarget();
 			copy(hdr, null);
 			copy(hdr, null);
 			// no warnings
 			// no warnings
@@ -299,15 +272,16 @@ class Renderer extends h3d.scene.Renderer {
 
 
 		pbrProps.isScreen = true;
 		pbrProps.isScreen = true;
 
 
-		pbrIndirect.drawIndirectDiffuse = true;
-		pbrIndirect.drawIndirectSpecular = false;
-		pbrOutIndirect.pass.stencil.setFunc(NotEqual, 0x80, 0x80, 0x80);
-		pbrOutIndirect.render();
-
 		pbrIndirect.drawIndirectDiffuse = false;
 		pbrIndirect.drawIndirectDiffuse = false;
 		pbrIndirect.drawIndirectSpecular = true;
 		pbrIndirect.drawIndirectSpecular = true;
-		pbrOutIndirect.pass.stencil.setFunc(Always);
-		pbrOutIndirect.render();
+		pbrOut.pass.stencil.setFunc(Always);
+		pbrOut.render();
+
+		pbrIndirect.showSky = false;
+		pbrIndirect.drawIndirectDiffuse = true;
+		pbrIndirect.drawIndirectSpecular = false;
+		pbrOut.pass.stencil.setFunc(NotEqual, 0x80, 0x80, 0x80);
+		pbrOut.render();
 
 
 		apply(AfterHdr);
 		apply(AfterHdr);
 
 
@@ -434,6 +408,7 @@ class Renderer extends h3d.scene.Renderer {
 						<option value="Hide">Hide</option>
 						<option value="Hide">Hide</option>
 						<option value="Env">Show</option>
 						<option value="Env">Show</option>
 						<option value="Irrad">Show Irrad</option>
 						<option value="Irrad">Show Irrad</option>
+						<option value="Background">Background Color</option>
 					</select>
 					</select>
 					<br/>
 					<br/>
 					<input type="range" min="0" max="2" field="envPower"/>
 					<input type="range" min="0" max="2" field="envPower"/>

+ 9 - 2
h3d/shader/pbr/Lighting.hx

@@ -11,6 +11,9 @@ class Indirect extends PropsDefinition {
 		@param var irrPower : Float;
 		@param var irrPower : Float;
 
 
 		@const var showSky : Bool;
 		@const var showSky : Bool;
+		@const var skyColor : Bool;
+		@param var skyColorValue : Vec3;
+
 		@const var drawIndirectDiffuse : Bool;
 		@const var drawIndirectDiffuse : Bool;
 		@const var drawIndirectSpecular : Bool;
 		@const var drawIndirectSpecular : Bool;
 		@param var skyMap : SamplerCube;
 		@param var skyMap : SamplerCube;
@@ -22,8 +25,12 @@ class Indirect extends PropsDefinition {
 			var isSky = normal.dot(normal) <= 0;
 			var isSky = normal.dot(normal) <= 0;
 			if( isSky ) {
 			if( isSky ) {
 				if( showSky ) {
 				if( showSky ) {
-					normal = (vec3( uvToScreen(calculatedUV) * 5. /*?*/ , 1. ) * cameraInvViewProj.mat3x4()).normalize();
-					pixelColor.rgb = skyMap.get(normal).rgb.pow(vec3(2.)) * irrPower;
+					if( skyColor ) {
+						pixelColor.rgb = skyColorValue * irrPower;
+					} else {
+						normal = (vec3( uvToScreen(calculatedUV) * 5. /*?*/ , 1. ) * cameraInvViewProj.mat3x4()).normalize();
+						pixelColor.rgb = skyMap.get(normal).rgb.pow(vec3(2.)) * irrPower;
+					}
 				} else
 				} else
 					discard;
 					discard;
 			} else {
 			} else {