Ver código fonte

Add AfterTonemapping pass

ShiroSmith 6 anos atrás
pai
commit
227f6de089
2 arquivos alterados com 25 adições e 18 exclusões
  1. 4 1
      h3d/mat/PbrMaterial.hx
  2. 21 17
      h3d/scene/pbr/Renderer.hx

+ 4 - 1
h3d/mat/PbrMaterial.hx

@@ -5,6 +5,7 @@ package h3d.mat;
 	var Overlay = "Overlay";
 	var Decal = "Decal";
 	var BeforeTonemapping = "BeforeTonemapping";
+	var AfterTonemapping = "AfterTonemapping";
 	var Distortion = "Distortion";
 }
 
@@ -197,6 +198,8 @@ class PbrMaterial extends Material {
 			mainPass.setPassName("beforeTonemapping");
 			if( props.emissive > 0 ) 
 				mainPass.addShader(new h3d.shader.Emissive(props.emissive));
+		case AfterTonemapping:
+			mainPass.setPassName("afterTonemapping");
 		case Distortion:
 			mainPass.setPassName("distortion");
 			mainPass.depthWrite = false;
@@ -415,7 +418,7 @@ class PbrMaterial extends Material {
 					<select field="mode">
 						<option value="PBR">PBR</option>
 						<option value="BeforeTonemapping">Before Tonemapping</option>
-						<option value="Albedo">Albedo</option>
+						<option value="AfterTonemapping">After Tonemapping</option>
 						<option value="Overlay">Overlay</option>
 						<option value="Distortion">Distortion</option>
 						<option value="Decal">Decal</option>

+ 21 - 17
h3d/scene/pbr/Renderer.hx

@@ -236,15 +236,15 @@ class Renderer extends h3d.scene.Renderer {
 		var props : RenderProps = props;
 
 		var albedo = allocTarget("albedo", true, 1.);
-		var normal = allocTarget("normal",false,1.,RGBA16F);
-		var pbr = allocTarget("pbr",false,1.);
-		var other = allocTarget("other",false,1.,RGBA32F);
+		var normal = allocTarget("normal", false, 1., RGBA16F);
+		var pbr = allocTarget("pbr", false, 1.);
+		var other = allocTarget("other", false, 1., RGBA32F);
 
-		ctx.setGlobal("albedoMap",{ texture : albedo, channel : hxsl.Channel.R });
-		ctx.setGlobal("depthMap",{ texture : other, channel : hxsl.Channel.G });
-		ctx.setGlobal("normalMap",{ texture : normal, channel : hxsl.Channel.R });
-		ctx.setGlobal("occlusionMap",{ texture : pbr, channel : hxsl.Channel.B });
-		ctx.setGlobal("bloom",null);
+		ctx.setGlobal("albedoMap", { texture : albedo, channel : hxsl.Channel.R });
+		ctx.setGlobal("depthMap", { texture : other, channel : hxsl.Channel.G });
+		ctx.setGlobal("normalMap", { texture : normal, channel : hxsl.Channel.R });
+		ctx.setGlobal("occlusionMap", { texture : pbr, channel : hxsl.Channel.B });
+		ctx.setGlobal("bloom", null);
 
 		var ls = hxd.impl.Api.downcast(getLightSystem(), LightSystem);
 		var count = ctx.engine.drawCalls;
@@ -255,6 +255,7 @@ class Renderer extends h3d.scene.Renderer {
 		clear(0, 1, 0);
 		mainDraw();
 
+		// Depth Copy 
 		var depth = allocTarget("depth",false,1.,R32F);
 		var depthMap = ctx.getGlobal("depthMap");
 		depthCopy.shader.depthTexture = depthMap.texture;
@@ -266,7 +267,7 @@ class Renderer extends h3d.scene.Renderer {
 		setTargets([albedo,normal,pbr]);
 		renderPass(decalsOutput, get("decal"));
 
-		if(renderMode == Default){
+		if(renderMode == Default) {
 			if( displayMode == Env )
 				clear(0xFF404040);
 
@@ -298,9 +299,9 @@ class Renderer extends h3d.scene.Renderer {
 		pbrIndirect.irrDiffuse = env.diffuse;
 		pbrIndirect.irrSpecular = env.specular;
 		pbrIndirect.irrSpecularLevels = env.specLevels;
+		pbrIndirect.cameraInvViewProj.load(ctx.camera.getInverseViewProj());
 
 		pbrDirect.doDiscard = false;
-		pbrIndirect.cameraInvViewProj.load(ctx.camera.getInverseViewProj());
 		switch( renderMode ) {
 		case Default:
 			pbrIndirect.drawIndirectDiffuse = true;
@@ -323,7 +324,6 @@ class Renderer extends h3d.scene.Renderer {
 			pbrIndirect.skyColor = false;
 			pbrIndirect.skyMap = env.env;
 		}
-
 		pbrDirect.doDiscard = true;
 
 		var lpass = screenLightPass;
@@ -335,7 +335,7 @@ class Renderer extends h3d.scene.Renderer {
 			screenLightPass = lpass;
 		}
 
-		// Draw DirLight, screenShader
+		// Direct Lighting - FullScreen
 		pbrProps.isScreen = true;
 		if( ls != null ) {
 			var count = ctx.engine.drawCalls;
@@ -343,7 +343,7 @@ class Renderer extends h3d.scene.Renderer {
 			ctx.lightSystem.drawPasses += ctx.engine.drawCalls - count;
 		}
 
-		// Draw others lights with their primitive
+		// Direct Lighting - With Primitive
 		pbrProps.isScreen = false;
 		draw(pbrLightPass.name);
 
@@ -357,14 +357,16 @@ class Renderer extends h3d.scene.Renderer {
 			return;
 		}
 
+		// Indirect Lighting - Diffuse with volumetricLightmap
+		pbrProps.isScreen = false;
 		pbrIndirect.drawIndirectDiffuse = false;
 		pbrIndirect.drawIndirectSpecular = true;
 		ctx.extraShaders = new hxsl.ShaderList(pbrProps, new hxsl.ShaderList(pbrIndirect, null));
 		draw("volumetricLightmap");
 		ctx.extraShaders = null;
-
+		
+		// Indirect Lighting - Diffuse and Specular
 		pbrProps.isScreen = true;
-
 		pbrIndirect.drawIndirectDiffuse = true;
 		pbrIndirect.drawIndirectSpecular = true;
 		pbrOut.render();
@@ -375,16 +377,16 @@ class Renderer extends h3d.scene.Renderer {
 		apply(BeforeTonemapping);
 
 		var distortion = allocTarget("distortion", true, 1.0, RG16F);
-		distortion.clear(0x000000);
 		setTarget(distortion);
+		clear(0);
 		draw("distortion");
 
 		var ldr = allocTarget("ldrOutput");
 		setTarget(ldr);
 		ctx.setGlobal("ldr", ldr);
-		var bloom = ctx.getGlobal("bloom");
 
 		// Bloom Params
+		var bloom = ctx.getGlobal("bloom");
 		tonemap.shader.bloom = bloom;
 		tonemap.shader.hasBloom = bloom != null;
 
@@ -408,6 +410,8 @@ class Renderer extends h3d.scene.Renderer {
 		tonemap.shader.hdrTexture = hdr;
 		tonemap.render();
 
+		draw("afterTonemappingDecal");
+		draw("afterTonemapping");
 		apply(AfterTonemapping);
 
 		postDraw();