瀏覽代碼

fixed sao sample (close #347)

Nicolas Cannasse 7 年之前
父節點
當前提交
6c43ababaf
共有 1 個文件被更改,包括 18 次插入26 次删除
  1. 18 26
      samples/Sao.hx

+ 18 - 26
samples/Sao.hx

@@ -9,22 +9,20 @@ class CustomRenderer extends h3d.scene.DefaultRenderer {
 	public var mode = 0;
 	public var mode = 0;
 	public var hasMRT : Bool;
 	public var hasMRT : Bool;
 	var out : h3d.mat.Texture;
 	var out : h3d.mat.Texture;
-	var mrt : h3d.pass.MRT;
+	var mrt : h3d.pass.Output;
 
 
 	public var bench = new h3d.impl.Benchmark();
 	public var bench = new h3d.impl.Benchmark();
 
 
 	public function new() {
 	public function new() {
 		super();
 		super();
 		sao = new h3d.pass.ScalableAO();
 		sao = new h3d.pass.ScalableAO();
-		// TODO : use a special Blur that prevents bluring across depths
 		saoBlur = new h3d.pass.Blur(3, 3, 2);
 		saoBlur = new h3d.pass.Blur(3, 3, 2);
 		sao.shader.sampleRadius	= 0.2;
 		sao.shader.sampleRadius	= 0.2;
+		sao.shader.numSamples = 30;
 		hasMRT = h3d.Engine.getCurrent().driver.hasFeature(MultipleRenderTargets);
 		hasMRT = h3d.Engine.getCurrent().driver.hasFeature(MultipleRenderTargets);
-		if( hasMRT ) {
-			allPasses.remove(defaultPass);
-			defaultPass = mrt = new h3d.pass.MRT([Value("output.color"), PackFloat(Value("output.depth")), PackNormal(Value("output.normal"))], 0, true);
-			allPasses.push(defaultPass);
-		}
+		if( !hasMRT ) throw "This sample requires MRT";
+		mrt = new h3d.pass.Output("mrt",[Value("output.color"), PackFloat(Value("output.depth")), PackNormal(Value("output.normal"))]);
+		allPasses.push(mrt);
 	}
 	}
 
 
 	override function renderPass(p:h3d.pass.Base, passes) {
 	override function renderPass(p:h3d.pass.Base, passes) {
@@ -33,23 +31,26 @@ class CustomRenderer extends h3d.scene.DefaultRenderer {
 	}
 	}
 
 
 	override function render() {
 	override function render() {
-		super.render();
+		renderPass(shadow,get("shadow"));
+		var color = allocTarget("color");
+		var depth = allocTarget("depth");
+		var normal = allocTarget("normal");
+		setTargets([color,depth,normal]);
+		clear(0,1);
+		mrt.draw(get("default"));
+		resetTarget();
 		if(mode != 1) {
 		if(mode != 1) {
 			bench.measure("sao");
 			bench.measure("sao");
 			var saoTarget = allocTarget("sao",0,false);
 			var saoTarget = allocTarget("sao",0,false);
 			setTarget(saoTarget);
 			setTarget(saoTarget);
-			if( hasMRT )
-				sao.apply(mrt.getTexture(1), mrt.getTexture(2), ctx.camera);
-			else
-				sao.apply(ctx.textures.get(0), ctx.textures.get(1), ctx.camera);
-			resetTarget();
+			sao.apply(depth, normal, ctx.camera);
 			bench.measure("saoBlur");
 			bench.measure("saoBlur");
 			saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
 			saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
 			bench.measure("saoBlend");
 			bench.measure("saoBlend");
-			if( hasMRT ) h3d.pass.Copy.run(mrt.getTexture(0), null);
+			copy(color, null);
 			copy(saoTarget, null, mode == 0 ? Multiply : null);
 			copy(saoTarget, null, mode == 0 ? Multiply : null);
-		} else if( hasMRT )
-			copy(mrt.getTexture(0), null);
+		} else
+			copy(color, null);
 	}
 	}
 
 
 }
 }
@@ -59,14 +60,6 @@ class Sao extends SampleApp {
 	var wscale = 1.;
 	var wscale = 1.;
 	var renderer : CustomRenderer;
 	var renderer : CustomRenderer;
 
 
-	function initMaterial( m : h3d.mat.Material ) {
-		m.mainPass.enableLights = true;
-		if( !Std.instance(s3d.renderer,CustomRenderer).hasMRT ) {
-			m.addPass(new h3d.mat.Pass("depth", m.mainPass));
-			m.addPass(new h3d.mat.Pass("normal", m.mainPass));
-		}
-	}
-
 	override function render(e:h3d.Engine) {
 	override function render(e:h3d.Engine) {
 		renderer.bench.begin();
 		renderer.bench.begin();
 		s3d.render(e);
 		s3d.render(e);
@@ -88,7 +81,6 @@ class Sao extends SampleApp {
 		floor.addNormals();
 		floor.addNormals();
 		floor.translate( -5, -5, 0);
 		floor.translate( -5, -5, 0);
 		var m = new h3d.scene.Mesh(floor, s3d);
 		var m = new h3d.scene.Mesh(floor, s3d);
-		initMaterial(m.material);
 		m.material.color.makeColor(0.35, 0.5, 0.5);
 		m.material.color.makeColor(0.35, 0.5, 0.5);
 		m.setScale(wscale);
 		m.setScale(wscale);
 
 
@@ -100,7 +92,6 @@ class Sao extends SampleApp {
 			p.setScale(wscale);
 			p.setScale(wscale);
 			p.x = r.srand(3) * wscale;
 			p.x = r.srand(3) * wscale;
 			p.y = r.srand(3) * wscale;
 			p.y = r.srand(3) * wscale;
-			initMaterial(p.material);
 			p.material.color.makeColor(r.rand() * 0.3, 0.5, 0.5);
 			p.material.color.makeColor(r.rand() * 0.3, 0.5, 0.5);
 		}
 		}
 		s3d.camera.zNear = 0.1 * wscale;
 		s3d.camera.zNear = 0.1 * wscale;
@@ -116,6 +107,7 @@ class Sao extends SampleApp {
 		new h3d.scene.CameraController(s3d).loadFromCamera();
 		new h3d.scene.CameraController(s3d).loadFromCamera();
 
 
 		var c = renderer;
 		var c = renderer;
+		//addSlider("Samples", function() return c.sao.shader.numSamples, function(v) c.sao.shader.numSamples = Std.int(v), 0, 40);
 		addSlider("Bias", function() return c.sao.shader.bias, function(v) c.sao.shader.bias = v, 0, 0.3);
 		addSlider("Bias", function() return c.sao.shader.bias, function(v) c.sao.shader.bias = v, 0, 0.3);
 		addSlider("Intensity", function() return c.sao.shader.intensity, function(v) c.sao.shader.intensity = v, 0, 10);
 		addSlider("Intensity", function() return c.sao.shader.intensity, function(v) c.sao.shader.intensity = v, 0, 10);
 		addSlider("Radius", function() return c.sao.shader.sampleRadius, function(v) c.sao.shader.sampleRadius = v);
 		addSlider("Radius", function() return c.sao.shader.sampleRadius, function(v) c.sao.shader.sampleRadius = v);