Browse Source

cleanup/review pbr material setup & renderer

ncannasse 7 years ago
parent
commit
ca0abd219c
3 changed files with 79 additions and 40 deletions
  1. 54 19
      h3d/mat/PbrMaterialSetup.hx
  2. 1 13
      h3d/scene/pbr/LightSystem.hx
  3. 24 8
      h3d/scene/pbr/Renderer.hx

+ 54 - 19
h3d/mat/PbrMaterialSetup.hx

@@ -1,11 +1,20 @@
 package h3d.mat;
 
 @:enum private abstract DefaultKind(String) {
-	var Opaque = "Opaque";
+	var PBR = "PBR";
+	var Albedo = "Albedo";
+	var Overlay = "Overlay";
+}
+
+@:enum private abstract DefaultBlend(String) {
+	var None = "None";
+	var Alpha = "Alpha";
+	var Add = "Add";
 }
 
 private typedef DefaultProps = {
 	var kind : DefaultKind;
+	var blend : DefaultBlend;
 	var shadows : Bool;
 	var alphaKill : Bool;
 	var culled : Bool;
@@ -31,8 +40,13 @@ class PbrMaterialSetup extends MaterialSetup {
 	override function createRenderer() : h3d.scene.Renderer {
 		var irrad = irrad;
 		if( irrad == null ) {
-			var envMap = new h3d.mat.Texture(16,16,[Cube]);
-			envMap.clear(0x808080);
+			var envMap = new h3d.mat.Texture(4,4,[Cube]);
+			var pix = hxd.Pixels.alloc(envMap.width, envMap.height, RGBA);
+			var COLORS = [0xC08080,0xA08080,0x80C080,0x80A080,0x8080C0,0x808080];
+			for( i in 0...6 ) {
+				pix.clear(COLORS[i]);
+				envMap.uploadPixels(pix,0,i);
+			}
 			irrad = new h3d.scene.pbr.Irradiance(envMap);
 			irrad.compute();
 			this.irrad = irrad;
@@ -50,18 +64,7 @@ class PbrMaterialSetup extends MaterialSetup {
 			props = getDefaults();
 			// use hmd material
 			var props : DefaultProps = props;
-			/*switch( material.blendMode ) {
-			case Alpha:
-				props.kind = Alpha;
-			case Add:
-				props.kind = Add;
-				props.culled = false;
-				props.shadows = false;
-				props.lighted = false;
-			case None:
-			default:
-				throw "Unsupported HMD material " + material.blendMode;
-			}*/
+			// TODO : handle HMD alpha correctly
 		}
 		material.props = props;
 	}
@@ -69,9 +72,18 @@ class PbrMaterialSetup extends MaterialSetup {
 	override function getDefaults( ?type : String ) : Any {
 		var props : DefaultProps;
 		switch( type ) {
+		case "ui":
+			props = {
+				kind : Overlay,
+				blend : Alpha,
+				shadows : false,
+				culled : false,
+				alphaKill : true,
+			};
 		default:
 			props = {
-				kind : Opaque,
+				kind : PBR,
+				blend : None,
 				shadows : true,
 				culled : true,
 				alphaKill : false,
@@ -84,10 +96,23 @@ class PbrMaterialSetup extends MaterialSetup {
 		var props : DefaultProps = m.props;
 		var mainPass = m.mainPass;
 		switch( props.kind ) {
-		case Opaque:
+		case PBR:
+			mainPass.setPassName("default");
+		case Albedo:
+			mainPass.setPassName("albedo");
+		case Overlay:
+			mainPass.setPassName("overlay");
+		}
+		switch( props.blend ) {
+		case None:
 			mainPass.setBlendMode(None);
 			mainPass.depthWrite = true;
-			mainPass.setPassName("default");
+		case Alpha:
+			mainPass.setBlendMode(Alpha);
+			mainPass.depthWrite = false;
+		case Add:
+			mainPass.setBlendMode(Add);
+			mainPass.depthWrite = false;
 		}
 		var tshader = m.textureShader;
 		if( tshader != null ) {
@@ -129,7 +154,17 @@ class PbrMaterialSetup extends MaterialSetup {
 				<dt>Kind</dt>
 				<dd>
 					<select field="kind">
-						<option value="Opaque">Opaque</option>
+						<option value="PBR">PBR</option>
+						<option value="Albedo">Albedo</option>
+						<option value="Overlay">Overlay</option>
+					</select>
+				</dd>
+				<dt>Blend</dt>
+				<dd>
+					<select field="blend">
+						<option value="None">None</option>
+						<option value="Alpha">Alpha</option>
+						<option value="Add">Add</option>
 					</select>
 				</dd>
 				<dt>Shadows</dt><dd><input type="checkbox" field="shadows"/></dd>

+ 1 - 13
h3d/scene/pbr/LightSystem.hx

@@ -3,9 +3,6 @@ package h3d.scene.pbr;
 @:access(h3d.scene.pbr.Light)
 class LightSystem extends h3d.scene.LightSystem {
 
-	var lightPass : h3d.pass.ScreenFx<h3d.shader.pbr.PropsImport>;
-	var initDone = false;
-
 	override function computeLight( obj : h3d.scene.Object, shaders : hxsl.ShaderList ) : hxsl.ShaderList {
 		var light = Std.instance(obj, h3d.scene.pbr.Light);
 		if( light != null )
@@ -13,16 +10,7 @@ class LightSystem extends h3d.scene.LightSystem {
 		return shaders;
 	}
 
-	public function drawLights( r : Renderer ) {
-
-		if( lightPass == null ) {
-			initDone = true;
-			lightPass = new h3d.pass.ScreenFx(r.pbrProps);
-			lightPass.addShader(new h3d.shader.ScreenShader());
-			lightPass.addShader(r.pbrDirect);
-			@:privateAccess lightPass.pass.setBlendMode(Add);
-		}
-
+	public function drawLights( r : Renderer, lightPass : h3d.pass.ScreenFx<Dynamic> ) {
 		var light = @:privateAccess ctx.lights;
 		var currentTarget = ctx.engine.getCurrentTarget();
 		var width = currentTarget == null ? ctx.engine.width : currentTarget.width;

+ 24 - 8
h3d/scene/pbr/Renderer.hx

@@ -2,6 +2,7 @@ package h3d.scene.pbr;
 
 enum DisplayMode {
 	Pbr;
+	MatCap;
 	Slides;
 }
 
@@ -11,12 +12,12 @@ class Renderer extends h3d.scene.Renderer {
 	var pbrOut = new h3d.pass.ScreenFx(new h3d.shader.pbr.Lighting.Indirect());
 	var pbrSun = new h3d.shader.pbr.Light.DirLight();
 	var pbrLightPass : h3d.mat.Pass;
+	var screenLightPass : h3d.pass.ScreenFx<h3d.shader.pbr.PropsImport>;
 	var fxaa = new h3d.pass.FXAA();
 	var shadows = new h3d.pass.ShadowMap(2048);
-	var hasSun = false;
+	var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
+	var pbrProps = new h3d.shader.pbr.PropsImport();
 
-	public var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
-	public var pbrProps = new h3d.shader.pbr.PropsImport();
 	public var displayMode : DisplayMode = Pbr;
 	public var irrad : Irradiance;
 
@@ -33,7 +34,6 @@ class Renderer extends h3d.scene.Renderer {
 		shadows.power = 1000;
 		shadows.blur.passes = 1;
 		defaultPass = new h3d.pass.Default("default");
-		pbrDirect.doDiscard = false;
 		pbrOut.addShader(new h3d.shader.ScreenShader());
 		pbrOut.addShader(pbrProps);
 		pbrOut.addShader(new h3d.shader.pbr.Shadow());
@@ -82,10 +82,18 @@ class Renderer extends h3d.scene.Renderer {
 		output.draw(getSort("default", true));
 
 		setTarget(albedo);
-		draw("color");
+		draw("albedo");
+
+		if( displayMode == MatCap ) {
+			clear(0x808080); // gray albedo
+			setTarget(pbr);
+			clear(0xFF00FF); // metal=1, rough=0, occlusion=1
+		}
 
 		var output = allocTarget("hdrOutput", 0, true);
 		setTarget(output);
+		if( ctx.engine.backgroundColor != null )
+			clear(ctx.engine.backgroundColor);
 		pbrProps.albedoTex = albedo;
 		pbrProps.normalTex = normal;
 		pbrProps.pbrTex = pbr;
@@ -119,19 +127,27 @@ class Renderer extends h3d.scene.Renderer {
 		pbrOut.render();
 
 		var ls = Std.instance(ls, LightSystem);
-		if( ls != null ) ls.drawLights(this);
+		var lpass = screenLightPass;
+		if( lpass == null ) {
+			lpass = new h3d.pass.ScreenFx(pbrProps);
+			lpass.addShader(new h3d.shader.ScreenShader());
+			lpass.addShader(pbrDirect);
+			@:privateAccess lpass.pass.setBlendMode(Add);
+			screenLightPass = lpass;
+		}
+		if( ls != null ) ls.drawLights(this, lpass);
 
 		pbrProps.isScreen = false;
 		draw("lights");
 		pbrProps.isScreen = true;
 
-		draw("late");
+		draw("overlay");
 		resetTarget();
 
 
 		switch( displayMode ) {
 
-		case Pbr:
+		case Pbr, MatCap:
 			fxaa.apply(output);
 
 		case Slides: