Przeglądaj źródła

Add beforeTonemapiing pass ( support emissive )
Update lightprobebaker

ShiroSmith 6 lat temu
rodzic
commit
27ff19a499

+ 7 - 0
h3d/mat/PbrMaterial.hx

@@ -5,6 +5,7 @@ package h3d.mat;
 	var Albedo = "Albedo";
 	var Overlay = "Overlay";
 	var Decal = "Decal";
+	var BeforeTonemapping = "BeforeTonemapping";
 }
 
 @:enum abstract PbrBlend(String) {
@@ -93,6 +94,11 @@ class PbrMaterial extends Material {
 			mainPass.setPassName("default");
 		case Albedo:
 			mainPass.setPassName("albedo");
+		case BeforeTonemapping:
+			mainPass.setPassName("BeforeTonemapping");
+			var e = mainPass.getShader(h3d.shader.Emissive);
+			if( e == null ) e = mainPass.addShader(new h3d.shader.Emissive(props.emissive));
+			e.emissive = props.emissive;
 		case Overlay:
 			mainPass.setPassName("overlay");
 		case Decal:
@@ -217,6 +223,7 @@ class PbrMaterial extends Material {
 				<dd>
 					<select field="mode">
 						<option value="PBR">PBR</option>
+						<option value="BeforeTonemapping">Before Tonemapping</option>
 						<option value="Albedo">Albedo</option>
 						<option value="Overlay">Overlay</option>
 					</select>

+ 4 - 6
h3d/scene/pbr/LightProbeBaker.hx

@@ -35,7 +35,7 @@ class LightProbeBaker {
 		customCamera.fovY = 90;
 	}
 
-	public function bake(renderer : h3d.scene.Renderer, s3d : Scene, volumetricLightMap : VolumetricLightmap, resolution : Int, ?time :Float) {
+	public function bake(s3d : Scene, volumetricLightMap : VolumetricLightmap, resolution : Int, ?time :Float) {
 
 		var timer = haxe.Timer.stamp();
 		var timeElapsed = 0.0;
@@ -45,12 +45,11 @@ class LightProbeBaker {
 
 		setupEnvMap(resolution);
 		setupShaderOutput(volumetricLightMap.shOrder);
+		var pbrRenderer = Std.instance(s3d.renderer, h3d.scene.pbr.Renderer);
 
 		// Save Scene Config
-		var oldRenderer = s3d.renderer;
 		var oldCamera = s3d.camera;
-		var oldRenderMode = renderer.renderMode;
-		s3d.renderer = renderer;
+		var oldRenderMode = s3d.renderer.renderMode;
 		s3d.renderer.renderMode = LightProbe;
 		s3d.camera = customCamera;
 		var engine = h3d.Engine.getCurrent();
@@ -81,7 +80,7 @@ class LightProbeBaker {
 			}
 			volumetricLightMap.lastBakedProbeIndex = index;
 
-			var sh : SphericalHarmonic = useGPU ? convertEnvIntoSH_GPU(renderer, envMap, volumetricLightMap.shOrder) : convertEnvIntoSH_CPU(envMap, volumetricLightMap.shOrder);
+			var sh : SphericalHarmonic = useGPU ? convertEnvIntoSH_GPU(pbrRenderer, envMap, volumetricLightMap.shOrder) : convertEnvIntoSH_CPU(envMap, volumetricLightMap.shOrder);
 			for(coef in 0... coefCount){
 				var u = coords.x + volumetricLightMap.probeCount.x * coef;
 				var v = coords.y + coords.z * volumetricLightMap.probeCount.y;
@@ -98,7 +97,6 @@ class LightProbeBaker {
 
 		// Restore Scene Config
 		s3d.camera = oldCamera;
-		s3d.renderer = oldRenderer;
 		s3d.renderer.renderMode = oldRenderMode;
 
 		return time - timeElapsed;

+ 4 - 3
h3d/scene/pbr/Renderer.hx

@@ -198,7 +198,6 @@ class Renderer extends h3d.scene.Renderer {
 		}
 		apply(BeforeHdr);
 
-
 		var hdr = allocTarget("hdrOutput", true, 1, RGBA16F);
 		ctx.setGlobal("hdr", hdr);
 		setTarget(hdr);
@@ -239,8 +238,9 @@ class Renderer extends h3d.scene.Renderer {
 			};
 		case LightProbe:
 			pbrIndirect.drawIndirectDiffuse = false;
-			pbrIndirect.drawIndirectSpecular= false;
+			pbrIndirect.drawIndirectSpecular = false;
 			pbrIndirect.showSky = true;
+			pbrIndirect.skyColor = false;
 			pbrIndirect.skyMap = env.env;
 		}
 
@@ -284,6 +284,8 @@ class Renderer extends h3d.scene.Renderer {
 		pbrOut.pass.stencil.setFunc(NotEqual, 0x80, 0x80, 0x80);
 		pbrOut.render();
 
+		draw("BeforeTonemapping");
+
 		apply(AfterHdr);
 
 		var ldr = allocTarget("ldrOutput");
@@ -302,7 +304,6 @@ class Renderer extends h3d.scene.Renderer {
 		postDraw();
 		resetTarget();
 
-
 		switch( displayMode ) {
 
 		case Pbr, Env, MatCap:

+ 1 - 1
hxd/prefab/rfx/Bloom.hx

@@ -60,7 +60,7 @@ class Bloom extends RendererFX {
 			<dt>Blur</dt><dd><input type="range" min="0" max="20" field="blur"/></dd>
 			<dt>Saturation</dt><dd><input type="range" min="-1" max="1" field="saturation"/></dd>
 			<dt>Blur Quality</dt><dd><input type="range" min="0" max="1" field="blurQuality"/></dd>
-			<dt>BLur Linear</dt><dd><input type="range" min="0" max="1" field="blurLinear"/></dd>
+			<dt>Blur Linear</dt><dd><input type="range" min="0" max="1" field="blurLinear"/></dd>
 			</dl>
 		'),props);
 	}