|
@@ -10,6 +10,8 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
public var hasMRT : Bool;
|
|
public var hasMRT : Bool;
|
|
var out : h3d.mat.Texture;
|
|
var out : h3d.mat.Texture;
|
|
|
|
|
|
|
|
+ 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();
|
|
@@ -18,12 +20,18 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
sao.shader.sampleRadius = 0.2;
|
|
sao.shader.sampleRadius = 0.2;
|
|
hasMRT = h3d.Engine.getCurrent().driver.hasFeature(MultipleRenderTargets);
|
|
hasMRT = h3d.Engine.getCurrent().driver.hasFeature(MultipleRenderTargets);
|
|
if( hasMRT )
|
|
if( hasMRT )
|
|
- def = new h3d.pass.MRT(["color","depth","normal"],0,true);
|
|
|
|
|
|
+ def = new h3d.pass.MRT(["color", "depth", "normal"], 0, true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override function renderPass(name, p:h3d.pass.Base, passes) {
|
|
|
|
+ bench.measure(name);
|
|
|
|
+ return super.renderPass(name, p, passes);
|
|
}
|
|
}
|
|
|
|
|
|
override function render() {
|
|
override function render() {
|
|
super.render();
|
|
super.render();
|
|
if(mode != 1) {
|
|
if(mode != 1) {
|
|
|
|
+ bench.measure("sao");
|
|
var saoTarget = allocTarget("sao",0,false);
|
|
var saoTarget = allocTarget("sao",0,false);
|
|
setTarget(saoTarget);
|
|
setTarget(saoTarget);
|
|
if( hasMRT )
|
|
if( hasMRT )
|
|
@@ -31,7 +39,9 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
else
|
|
else
|
|
sao.apply(depth.getTexture(), normal.getTexture(), ctx.camera);
|
|
sao.apply(depth.getTexture(), normal.getTexture(), ctx.camera);
|
|
resetTarget();
|
|
resetTarget();
|
|
|
|
+ bench.measure("saoBlur");
|
|
saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
|
|
saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
|
|
|
|
+ bench.measure("saoBlend");
|
|
if( hasMRT ) h3d.pass.Copy.run(def.getTexture(0), null);
|
|
if( hasMRT ) h3d.pass.Copy.run(def.getTexture(0), null);
|
|
h3d.pass.Copy.run(saoTarget, null, mode == 0 ? Multiply : null);
|
|
h3d.pass.Copy.run(saoTarget, null, mode == 0 ? Multiply : null);
|
|
}
|
|
}
|
|
@@ -43,6 +53,7 @@ class Sao extends hxd.App {
|
|
|
|
|
|
var wscale = 1.;
|
|
var wscale = 1.;
|
|
var fui : h2d.Flow;
|
|
var fui : h2d.Flow;
|
|
|
|
+ var renderer : CustomRenderer;
|
|
|
|
|
|
function initMaterial( m : h3d.mat.MeshMaterial ) {
|
|
function initMaterial( m : h3d.mat.MeshMaterial ) {
|
|
m.mainPass.enableLights = true;
|
|
m.mainPass.enableLights = true;
|
|
@@ -52,6 +63,14 @@ class Sao extends hxd.App {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ override function render(e:h3d.Engine) {
|
|
|
|
+ renderer.bench.begin();
|
|
|
|
+ s3d.render(e);
|
|
|
|
+ renderer.bench.measure("ui");
|
|
|
|
+ s2d.render(e);
|
|
|
|
+ renderer.bench.end();
|
|
|
|
+ }
|
|
|
|
+
|
|
override function init() {
|
|
override function init() {
|
|
|
|
|
|
fui = new h2d.Flow(s2d);
|
|
fui = new h2d.Flow(s2d);
|
|
@@ -60,8 +79,9 @@ class Sao extends hxd.App {
|
|
|
|
|
|
var r = new hxd.Rand(Std.random(0xFFFFFF));
|
|
var r = new hxd.Rand(Std.random(0xFFFFFF));
|
|
|
|
|
|
- var c = new CustomRenderer();
|
|
|
|
- s3d.renderer = c;
|
|
|
|
|
|
+ renderer = new CustomRenderer();
|
|
|
|
+ s2d.add(renderer.bench, 10);
|
|
|
|
+ s3d.renderer = renderer;
|
|
|
|
|
|
var floor = new h3d.prim.Grid(40,40,0.25,0.25);
|
|
var floor = new h3d.prim.Grid(40,40,0.25,0.25);
|
|
floor.addNormals();
|
|
floor.addNormals();
|
|
@@ -94,11 +114,13 @@ class Sao extends hxd.App {
|
|
s3d.camera.pos.set(camdist * Math.cos(time), camdist * Math.sin(time), camdist * 0.5);
|
|
s3d.camera.pos.set(camdist * Math.cos(time), camdist * Math.sin(time), camdist * 0.5);
|
|
new h3d.scene.CameraController(s3d).loadFromCamera();
|
|
new h3d.scene.CameraController(s3d).loadFromCamera();
|
|
|
|
|
|
|
|
+ var c = renderer;
|
|
addSlider("Bias", 0, 0.3, function() return c.sao.shader.bias, function(v) c.sao.shader.bias = v);
|
|
addSlider("Bias", 0, 0.3, function() return c.sao.shader.bias, function(v) c.sao.shader.bias = v);
|
|
addSlider("Intensity", 0, 10, function() return c.sao.shader.intensity, function(v) c.sao.shader.intensity = v);
|
|
addSlider("Intensity", 0, 10, function() return c.sao.shader.intensity, function(v) c.sao.shader.intensity = v);
|
|
addSlider("Radius", 0, 1, function() return c.sao.shader.sampleRadius, function(v) c.sao.shader.sampleRadius = v);
|
|
addSlider("Radius", 0, 1, function() return c.sao.shader.sampleRadius, function(v) c.sao.shader.sampleRadius = v);
|
|
addSlider("Blur", 0, 3, function() return c.saoBlur.sigma, function(v) c.saoBlur.sigma = v);
|
|
addSlider("Blur", 0, 3, function() return c.saoBlur.sigma, function(v) c.saoBlur.sigma = v);
|
|
|
|
|
|
|
|
+ onResize();
|
|
}
|
|
}
|
|
|
|
|
|
function addSlider( text, min : Float, max : Float, get : Void -> Float, set : Float -> Void ) {
|
|
function addSlider( text, min : Float, max : Float, get : Void -> Float, set : Float -> Void ) {
|
|
@@ -139,6 +161,10 @@ class Sao extends hxd.App {
|
|
init();
|
|
init();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ override function onResize() {
|
|
|
|
+ renderer.bench.y = s2d.height - renderer.bench.height;
|
|
|
|
+ }
|
|
|
|
+
|
|
override function update( dt : Float ) {
|
|
override function update( dt : Float ) {
|
|
|
|
|
|
if(K.isPressed(K.BACKSPACE))
|
|
if(K.isPressed(K.BACKSPACE))
|