فهرست منبع

added hxd.prefab.rfx for plugable effects

ncannasse 7 سال پیش
والد
کامیت
57056e8c0b
5فایلهای تغییر یافته به همراه174 افزوده شده و 106 حذف شده
  1. 1 0
      h3d/scene/Renderer.hx
  2. 17 106
      h3d/scene/pbr/Renderer.hx
  3. 57 0
      hxd/prefab/rfx/Bloom.hx
  4. 26 0
      hxd/prefab/rfx/RendererFX.hx
  5. 73 0
      hxd/prefab/rfx/Sao.hx

+ 1 - 0
h3d/scene/Renderer.hx

@@ -19,6 +19,7 @@ class Renderer extends hxd.impl.AnyProps {
 	var allPasses : Array<h3d.pass.Base>;
 	var allPasses : Array<h3d.pass.Base>;
 	var ctx : RenderContext;
 	var ctx : RenderContext;
 	var hasSetTarget = false;
 	var hasSetTarget = false;
+	public var effects : Array<hxd.prefab.rfx.RendererFX> = [];
 
 
 	public function new() {
 	public function new() {
 		allPasses = [];
 		allPasses = [];

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

@@ -30,24 +30,6 @@ package h3d.scene.pbr;
 	var Reinhard = "Reinhard";
 	var Reinhard = "Reinhard";
 }
 }
 
 
-typedef SaoProps = {
-	var enable : Bool;
-	var size : Float;
-	var blur : Float;
-	var samples : Int;
-	var radius : Float;
-	var intensity : Float;
-	var bias : Float;
-}
-
-typedef BloomProps = {
-	var enable : Bool;
-	var size : Float;
-	var threshold : Float;
-	var intensity : Float;
-	var blur : Float;
-}
-
 typedef ShadowProps = {
 typedef ShadowProps = {
 	var enable : Bool;
 	var enable : Bool;
 	var power : Float;
 	var power : Float;
@@ -63,8 +45,6 @@ typedef RenderProps = {
 	var exposure : Float;
 	var exposure : Float;
 	var sky : SkyMode;
 	var sky : SkyMode;
 	var tone : TonemapMap;
 	var tone : TonemapMap;
-	var bloom : BloomProps;
-	var sao : SaoProps;
 	var shadow : ShadowProps;
 	var shadow : ShadowProps;
 	var emissive : Float;
 	var emissive : Float;
 }
 }
@@ -82,11 +62,6 @@ class Renderer extends h3d.scene.Renderer {
 	var pbrIndirect = new h3d.shader.pbr.Lighting.Indirect();
 	var pbrIndirect = new h3d.shader.pbr.Lighting.Indirect();
 	var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
 	var pbrDirect = new h3d.shader.pbr.Lighting.Direct();
 	var pbrProps = new h3d.shader.pbr.PropsImport();
 	var pbrProps = new h3d.shader.pbr.PropsImport();
-	var sao = new h3d.pass.ScalableAO();
-	var saoBlur = new h3d.pass.Blur();
-	var saoCopy = new h3d.pass.Copy();
-	var bloomPass = new h3d.pass.ScreenFx(new h3d.shader.pbr.Bloom());
-	var bloomBlur = new h3d.pass.Blur();
 	var hasDebugEvent = false;
 	var hasDebugEvent = false;
 
 
 	public var skyMode : SkyMode = Hide;
 	public var skyMode : SkyMode = Hide;
@@ -160,6 +135,12 @@ class Renderer extends h3d.scene.Renderer {
 		draw("overlay");
 		draw("overlay");
 	}
 	}
 
 
+	function apply( step : hxd.prefab.rfx.RendererFX.Step ) {
+		for( f in effects )
+			if( f.enabled )
+				f.apply(ctx, step);
+	}
+
 	override function render() {
 	override function render() {
 		var props : RenderProps = props;
 		var props : RenderProps = props;
 
 
@@ -178,12 +159,17 @@ class Renderer extends h3d.scene.Renderer {
 		var normal = allocTarget("normalDepth",false,1.,RGBA16F);
 		var normal = allocTarget("normalDepth",false,1.,RGBA16F);
 		var pbr = allocTarget("pbr",false,1.);
 		var pbr = allocTarget("pbr",false,1.);
 		var other = allocTarget("other",false,1.,RGBA32F);
 		var other = allocTarget("other",false,1.,RGBA32F);
+
+		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);
+
 		setTargets([albedo,normal,pbr,other]);
 		setTargets([albedo,normal,pbr,other]);
 		clear(0, 1, 0);
 		clear(0, 1, 0);
 		mainDraw();
 		mainDraw();
 
 
 		setTargets([albedo,normal,pbr]);
 		setTargets([albedo,normal,pbr]);
-		ctx.setGlobal("depthMap",{ texture : other, channel : hxsl.Channel.G });
 		decalsOutput.draw(get("decal"));
 		decalsOutput.draw(get("decal"));
 
 
 		setTarget(albedo);
 		setTarget(albedo);
@@ -198,25 +184,10 @@ class Renderer extends h3d.scene.Renderer {
 			clear(0x00FF80FF);
 			clear(0x00FF80FF);
 		}
 		}
 
 
-		if( props.sao.enable ) {
-			var sp = props.sao;
-			var saoTex = allocTarget("sao",false,sp.size);
-			setTarget(saoTex);
-			sao.shader.depthTextureChannel = G;
-			sao.shader.normalTextureChannel = R;
-			sao.shader.numSamples = sp.samples;
-			sao.shader.sampleRadius	= sp.radius;
-			sao.shader.intensity = sp.intensity;
-			sao.shader.bias = sp.bias * sp.bias;
-			sao.apply(other,normal,ctx.camera);
-			saoBlur.radius = sp.blur;
-			saoBlur.quality = 0.5;
-			saoBlur.apply(ctx, saoTex);
-			saoCopy.pass.setColorMask(false,false,true,false);
-			saoCopy.apply(saoTex, pbr, Multiply);
-		}
+		apply(BeforeHdr);
 
 
 		var hdr = allocTarget("hdrOutput", false, 1, RGBA16F);
 		var hdr = allocTarget("hdrOutput", false, 1, RGBA16F);
+		ctx.setGlobal("hdr", hdr);
 		setTarget(hdr);
 		setTarget(hdr);
 		if( ctx.engine.backgroundColor != null )
 		if( ctx.engine.backgroundColor != null )
 			clear(ctx.engine.backgroundColor);
 			clear(ctx.engine.backgroundColor);
@@ -277,21 +248,11 @@ class Renderer extends h3d.scene.Renderer {
 		draw("lights");
 		draw("lights");
 		pbrProps.isScreen = true;
 		pbrProps.isScreen = true;
 
 
-		var bloom : h3d.mat.Texture = null;
-		if( props.bloom.enable ) {
-			var pb = props.bloom;
-			bloom = allocTarget("bloom", false, pb.size, RGBA16F);
-			setTarget(bloom);
-			bloomPass.shader.hdr = hdr;
-			bloomPass.shader.threshold = pb.threshold;
-			bloomPass.shader.intensity = pb.intensity;
-			bloomPass.render();
-			bloomBlur.radius = pb.blur;
-			bloomBlur.apply(ctx, bloom);
-		}
+		apply(AfterHdr);
 
 
 		var ldr = allocTarget("ldrOutput");
 		var ldr = allocTarget("ldrOutput");
 		setTarget(ldr);
 		setTarget(ldr);
+		var bloom = ctx.getGlobal("bloom");
 		tonemap.shader.bloom = bloom;
 		tonemap.shader.bloom = bloom;
 		tonemap.shader.hasBloom = bloom != null;
 		tonemap.shader.hasBloom = bloom != null;
 		tonemap.shader.mode = switch( toneMode ) {
 		tonemap.shader.mode = switch( toneMode ) {
@@ -365,23 +326,7 @@ class Renderer extends h3d.scene.Renderer {
 				blur : 9,
 				blur : 9,
 				bias : 0.1,
 				bias : 0.1,
 				quality : 0.3,
 				quality : 0.3,
-			},
-			sao : {
-				enable : false,
-				size : 1,
-				blur : 5,
-				samples : 30,
-				radius : 1,
-				intensity : 1,
-				bias : 0.1,
-			},
-			bloom : {
-				enable : false,
-				size : 0.5,
-				blur : 3,
-				intensity : 1.,
-				threshold : 0.5,
-			},
+			}
 		};
 		};
 		return props;
 		return props;
 	}
 	}
@@ -418,26 +363,6 @@ class Renderer extends h3d.scene.Renderer {
 			</dt>
 			</dt>
 		';
 		';
 
 
-		var saoProps = '
-			<dl>
-			<dt>Intensity</dt><dd><input type="range" min="0" max="10" field="sao.intensity"/></dd>
-			<dt>Radius</dt><dd><input type="range" min="0" max="10" field="sao.radius"/></dd>
-			<dt>Bias</dt><dd><input type="range" min="0" max="0.5" field="sao.bias"/></dd>
-			<dt>Size</dt><dd><input type="range" min="0" max="1" field="sao.size"/></dd>
-			<dt>Blur</dt><dd><input type="range" min="0" max="20" field="sao.blur"/></dd>
-			<dt>Samples</dt><dd><input type="range" min="3" max="256" field="sao.samples" step="1"/></dd>
-			</dl>
-		';
-
-		var bloomProps = '
-			<dl>
-			<dt>Intensity</dt><dd><input type="range" min="0" max="2" field="bloom.intensity"/></dd>
-			<dt>Threshold</dt><dd><input type="range" min="0" max="1" field="bloom.threshold"/></dd>
-			<dt>Size</dt><dd><input type="range" min="0" max="1" field="bloom.size"/></dd>
-			<dt>Blur</dt><dd><input type="range" min="0" max="20" field="bloom.blur"/></dd>
-			</dl>
-		';
-
 		return new js.jquery.JQuery('
 		return new js.jquery.JQuery('
 			<div class="group" name="Renderer">
 			<div class="group" name="Renderer">
 			<dl>
 			<dl>
@@ -479,20 +404,6 @@ class Renderer extends h3d.scene.Renderer {
 				</div>
 				</div>
 				$shadowProps
 				$shadowProps
 			</div>
 			</div>
-
-			<div class="group">
-				<div class="title">
-					<input type="checkbox" field="bloom.enable"/> Bloom
-				</div>
-				$bloomProps
-			</div>
-
-			<div class="group">
-				<div class="title">
-					<input type="checkbox" field="sao.enable"/> SAO
-				</div>
-				$saoProps
-			</div>
 		');
 		');
 	}
 	}
 	#end
 	#end

+ 57 - 0
hxd/prefab/rfx/Bloom.hx

@@ -0,0 +1,57 @@
+package hxd.prefab.rfx;
+
+typedef BloomProps = {
+	var size : Float;
+	var threshold : Float;
+	var intensity : Float;
+	var blur : Float;
+}
+
+class Bloom extends RendererFX {
+
+	var bloomPass = new h3d.pass.ScreenFx(new h3d.shader.pbr.Bloom());
+	var bloomBlur = new h3d.pass.Blur();
+
+	public function new(?parent) {
+		super(parent);
+		props = ({
+			size : 0.5,
+			blur : 3,
+			intensity : 1.,
+			threshold : 0.5,
+		} : BloomProps);
+	}
+
+	override function apply(ctx:h3d.scene.RenderContext, step:hxd.prefab.rfx.RendererFX.Step) {
+		if( step == AfterHdr ) {
+			var pb : BloomProps = props;
+			var bloom = ctx.textures.allocTargetScale("bloom", pb.size, false, RGBA16F);
+			ctx.engine.pushTarget(bloom);
+			bloomPass.shader.hdr = ctx.getGlobal("hdr");
+			bloomPass.shader.threshold = pb.threshold;
+			bloomPass.shader.intensity = pb.intensity;
+			bloomPass.render();
+			ctx.engine.popTarget();
+
+			bloomBlur.radius = pb.blur;
+			bloomBlur.apply(ctx, bloom);
+			ctx.setGlobal("bloom",bloom);
+		}
+	}
+
+	#if editor
+	override function edit( ctx : hide.prefab.EditContext ) {
+		ctx.properties.add(new hide.Element('
+			<dl>
+			<dt>Intensity</dt><dd><input type="range" min="0" max="2" field="intensity"/></dd>
+			<dt>Threshold</dt><dd><input type="range" min="0" max="1" field="threshold"/></dd>
+			<dt>Size</dt><dd><input type="range" min="0" max="1" field="size"/></dd>
+			<dt>Blur</dt><dd><input type="range" min="0" max="20" field="blur"/></dd>
+			</dl>
+		'),props);
+	}
+	#end
+
+	static var _ = Library.register("rfx.bloom", Bloom);
+
+}

+ 26 - 0
hxd/prefab/rfx/RendererFX.hx

@@ -0,0 +1,26 @@
+package hxd.prefab.rfx;
+
+enum Step {
+	BeforeHdr;
+	AfterHdr;
+}
+
+class RendererFX extends Prefab {
+
+	public function apply( ctx : h3d.scene.RenderContext, step : Step ) {
+	}
+
+	override function save() {
+		return {};
+	}
+
+	override function load(v:Dynamic) {
+	}
+
+	#if editor
+	override function getHideProps() : hide.prefab.HideProps {
+		return { name : Type.getClassName(Type.getClass(this)).split(".").pop(), icon : "plus-circle" };
+	}
+	#end
+
+}

+ 73 - 0
hxd/prefab/rfx/Sao.hx

@@ -0,0 +1,73 @@
+package hxd.prefab.rfx;
+
+typedef SaoProps = {
+	var size : Float;
+	var blur : Float;
+	var samples : Int;
+	var radius : Float;
+	var intensity : Float;
+	var bias : Float;
+}
+
+class Sao extends RendererFX {
+
+	var sao : h3d.pass.ScalableAO;
+	var saoBlur = new h3d.pass.Blur();
+	var saoCopy = new h3d.pass.Copy();
+
+	public function new(?parent) {
+		super(parent);
+		props = ({
+			size : 1,
+			blur : 5,
+			samples : 30,
+			radius : 1,
+			intensity : 1,
+			bias : 0.1,
+		} : SaoProps);
+	}
+
+	override function apply( ctx : h3d.scene.RenderContext, step : RendererFX.Step ) {
+		if( step == BeforeHdr ) {
+			if( sao == null ) sao = new h3d.pass.ScalableAO();
+			var props : SaoProps = props;
+			var saoTex = ctx.textures.allocTargetScale("sao",props.size,false);
+			var normal : hxsl.ChannelTexture = ctx.getGlobal("normalMap");
+			var depth : hxsl.ChannelTexture = ctx.getGlobal("depthMap");
+			var occlu : hxsl.ChannelTexture = ctx.getGlobal("occlusionMap");
+			ctx.engine.pushTarget(saoTex);
+			sao.shader.numSamples = props.samples;
+			sao.shader.sampleRadius	= props.radius;
+			sao.shader.intensity = props.intensity;
+			sao.shader.bias = props.bias * props.bias;
+			sao.shader.depthTextureChannel = depth.channel;
+			sao.shader.normalTextureChannel = normal.channel;
+			sao.apply(depth.texture,normal.texture,ctx.camera);
+			ctx.engine.popTarget();
+
+			saoBlur.radius = props.blur;
+			saoBlur.quality = 0.5;
+			saoBlur.apply(ctx, saoTex);
+			saoCopy.pass.setColorChannel(occlu.channel);
+			saoCopy.apply(saoTex, occlu.texture, Multiply);
+		}
+	}
+
+	#if editor
+	override function edit( ctx : hide.prefab.EditContext ) {
+		ctx.properties.add(new hide.Element('
+			<dl>
+			<dt>Intensity</dt><dd><input type="range" min="0" max="10" field="intensity"/></dd>
+			<dt>Radius</dt><dd><input type="range" min="0" max="10" field="radius"/></dd>
+			<dt>Bias</dt><dd><input type="range" min="0" max="0.5" field="bias"/></dd>
+			<dt>Size</dt><dd><input type="range" min="0" max="1" field="size"/></dd>
+			<dt>Blur</dt><dd><input type="range" min="0" max="20" field="blur"/></dd>
+			<dt>Samples</dt><dd><input type="range" min="3" max="256" field="samples" step="1"/></dd>
+			</dl>
+		'),props);
+	}
+	#end
+
+	static var _ = Library.register("rfx.sao", Sao);
+
+}