Jelajahi Sumber

refactor pbr renderer and RendererFX

Nicolas Cannasse 5 tahun lalu
induk
melakukan
49e9ce6a30

+ 18 - 20
hide/Renderer.hx

@@ -158,27 +158,25 @@ class PbrRenderer extends h3d.scene.pbr.Renderer {
 		return props;
 		return props;
 	}
 	}
 
 
-	override function mainDraw() {
-		renderPass(output, get("default"), frontToBack);
-		renderPass(output, get("terrain"));
-		renderPass(output, get("alpha"), backToFront);
-		renderPass(output, get("additive"));
-
-		var outlineTex = allocTarget("outline", false);
-		setTarget(outlineTex);
-		clear(0);
-		draw("highlight");
-
-		var outlineBlurTex = allocTarget("outlineBlur", false);
-		outlineBlur.apply(ctx, outlineTex, outlineBlurTex);
-		outline.texture = outlineBlurTex;
-	}
+	override function end() {
+		switch( currentStep ) {
+		case MainDraw:
+			var outlineTex = allocTarget("outline", false);
+			setTarget(outlineTex);
+			clear(0);
+			draw("highlight");
 
 
-	override function postDraw() {
-		renderPass(defaultPass, get("debuggeom"), backToFront);
-		renderPass(defaultPass, get("debuggeom_alpha"), backToFront);
-		renderPass(defaultPass, get("overlay"), backToFront);
-		renderPass(defaultPass, get("ui"), backToFront);
+			var outlineBlurTex = allocTarget("outlineBlur", false);
+			outlineBlur.apply(ctx, outlineTex, outlineBlurTex);
+			outline.texture = outlineBlurTex;
+		case AfterTonemapping:
+			renderPass(defaultPass, get("debuggeom"), backToFront);
+			renderPass(defaultPass, get("debuggeom_alpha"), backToFront);
+			renderPass(defaultPass, get("ui"), backToFront);
+		default:
+		}
+		super.end();
 	}
 	}
+
 }
 }
 
 

+ 17 - 3
hrt/prefab/rfx/Bloom.hx

@@ -10,10 +10,22 @@ typedef BloomProps = {
 	var blurLinear : Float;
 	var blurLinear : Float;
 }
 }
 
 
+class BloomTonemap extends hxsl.Shader {
+	static var SRC = {
+		@param var bloomTexture : Sampler2D;
+		var calculatedUV : Vec2;
+		var hdrColor : Vec4;
+		function fragment() {
+			hdrColor += bloomTexture.get(calculatedUV);
+		}
+	}
+}
+
 class Bloom extends RendererFX {
 class Bloom extends RendererFX {
 
 
 	var bloomPass = new h3d.pass.ScreenFx(new hrt.shader.Bloom());
 	var bloomPass = new h3d.pass.ScreenFx(new hrt.shader.Bloom());
 	var bloomBlur = new h3d.pass.Blur();
 	var bloomBlur = new h3d.pass.Blur();
+	var tonemap = new BloomTonemap();
 
 
 	public function new(?parent) {
 	public function new(?parent) {
 		super(parent);
 		super(parent);
@@ -28,14 +40,14 @@ class Bloom extends RendererFX {
 		} : BloomProps);
 		} : BloomProps);
 	}
 	}
 
 
-	override function apply(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
+	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == BeforeTonemapping ) {
 		if( step == BeforeTonemapping ) {
 			r.mark("Bloom");
 			r.mark("Bloom");
 			var pb : BloomProps = props;
 			var pb : BloomProps = props;
 			var bloom = r.allocTarget("bloom", false, pb.size, RGBA16F);
 			var bloom = r.allocTarget("bloom", false, pb.size, RGBA16F);
 			var ctx = r.ctx;
 			var ctx = r.ctx;
 			ctx.engine.pushTarget(bloom);
 			ctx.engine.pushTarget(bloom);
-			bloomPass.shader.hdr = ctx.getGlobal("hdr");
+			bloomPass.shader.texture = ctx.getGlobal("hdrMap");
 			bloomPass.shader.threshold = pb.threshold;
 			bloomPass.shader.threshold = pb.threshold;
 			bloomPass.shader.intensity = pb.intensity;
 			bloomPass.shader.intensity = pb.intensity;
 			bloomPass.shader.colorMatrix.identity();
 			bloomPass.shader.colorMatrix.identity();
@@ -47,7 +59,9 @@ class Bloom extends RendererFX {
 			bloomBlur.quality = pb.blurQuality;
 			bloomBlur.quality = pb.blurQuality;
 			bloomBlur.linear = pb.blurLinear;
 			bloomBlur.linear = pb.blurLinear;
 			bloomBlur.apply(ctx, bloom);
 			bloomBlur.apply(ctx, bloom);
-			ctx.setGlobal("bloom",bloom);
+
+			tonemap.bloomTexture = bloom;
+			r.addShader(tonemap);
 		}
 		}
 	}
 	}
 
 

+ 2 - 2
hrt/prefab/rfx/DistanceBlur.hx

@@ -90,7 +90,7 @@ class DistanceBlur extends RendererFX {
 		blurPass.pass.setBlendMode(Alpha);
 		blurPass.pass.setBlendMode(Alpha);
 	}
 	}
 
 
-	override function apply(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
+	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		var p : DistanceBlurProps = props;
 		var p : DistanceBlurProps = props;
 		if( step == AfterTonemapping ) {
 		if( step == AfterTonemapping ) {
 			var ctx = r.ctx;
 			var ctx = r.ctx;
@@ -105,7 +105,7 @@ class DistanceBlur extends RendererFX {
 			blurPass.shader.farEndIntensity = p.farEndIntensity;
 			blurPass.shader.farEndIntensity = p.farEndIntensity;
 			var lbrBlurred : h3d.mat.Texture = ctx.getGlobal("ldrBlurred");
 			var lbrBlurred : h3d.mat.Texture = ctx.getGlobal("ldrBlurred");
 			if( lbrBlurred == null ) {
 			if( lbrBlurred == null ) {
-				var ldr : h3d.mat.Texture = ctx.getGlobal("ldr");
+				var ldr : h3d.mat.Texture = ctx.getGlobal("ldrMap");
 				lbrBlurred = r.allocTarget("ldrBlurred", false, 0.25, RGBA);
 				lbrBlurred = r.allocTarget("ldrBlurred", false, 0.25, RGBA);
 				r.copy(ldr, lbrBlurred);
 				r.copy(ldr, lbrBlurred);
 				lbrBlur.apply(ctx, lbrBlurred);
 				lbrBlur.apply(ctx, lbrBlurred);

+ 1 - 1
hrt/prefab/rfx/GenFog.hx

@@ -115,7 +115,7 @@ class GenFog extends RendererFX {
 		fogPass.pass.setBlendMode(Alpha);
 		fogPass.pass.setBlendMode(Alpha);
 	}
 	}
 
 
-	override function apply(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
+	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		var p : GenFogProps = props;
 		var p : GenFogProps = props;
 		if( (step == AfterTonemapping && p.renderMode == "AfterTonemapping") || (step == BeforeTonemapping && p.renderMode == "BeforeTonemapping") ) {
 		if( (step == AfterTonemapping && p.renderMode == "AfterTonemapping") || (step == BeforeTonemapping && p.renderMode == "BeforeTonemapping") ) {
 			r.mark("DistanceFog");
 			r.mark("DistanceFog");

+ 4 - 1
hrt/prefab/rfx/RendererFX.hx

@@ -2,7 +2,10 @@ package hrt.prefab.rfx;
 
 
 class RendererFX extends Prefab implements h3d.impl.RendererFX {
 class RendererFX extends Prefab implements h3d.impl.RendererFX {
 
 
-	public function apply( r : h3d.scene.Renderer, step : h3d.impl.RendererFX.Step ) {
+	public function begin( r : h3d.scene.Renderer, step : h3d.impl.RendererFX.Step ) {
+	}
+
+	public function end( r : h3d.scene.Renderer, step : h3d.impl.RendererFX.Step ) {
 	}
 	}
 
 
 	override function save() {
 	override function save() {

+ 2 - 2
hrt/prefab/rfx/Sao.hx

@@ -48,8 +48,8 @@ class Sao extends RendererFX {
 		return null;
 		return null;
 	}
 	}
 
 
-	override function apply( r : h3d.scene.Renderer, step : h3d.impl.RendererFX.Step ) {
-		if( step == BeforeLighting ) {
+	override function begin( r : h3d.scene.Renderer, step : h3d.impl.RendererFX.Step ) {
+		if( step == Lighting ) {
 			r.mark("SSAO");
 			r.mark("SSAO");
 			if( sao == null ) sao = new h3d.pass.ScalableAO();
 			if( sao == null ) sao = new h3d.pass.ScalableAO();
 			var props : SaoProps = props;
 			var props : SaoProps = props;

+ 8 - 6
hrt/prefab/rfx/TemporalBloom.hx

@@ -66,7 +66,7 @@ class DualFilterUp extends h3d.shader.ScreenShader {
 
 
 		@param var source : Sampler2D;
 		@param var source : Sampler2D;
 		@param var halfPixel : Vec2;
 		@param var halfPixel : Vec2;
-		
+
 		function fragment() {
 		function fragment() {
 			var sum = vec3(0,0,0);
 			var sum = vec3(0,0,0);
 			sum += texture(source, calculatedUV + vec2(-halfPixel.x * 2.0, 0.0)).rgb;
 			sum += texture(source, calculatedUV + vec2(-halfPixel.x * 2.0, 0.0)).rgb;
@@ -116,7 +116,7 @@ class Threshold extends h3d.shader.ScreenShader {
 				var prevPos =  vec4(pixelPos, 1.0) * prevCamMat;
 				var prevPos =  vec4(pixelPos, 1.0) * prevCamMat;
 				prevPos.xyz /= prevPos.w;
 				prevPos.xyz /= prevPos.w;
 				var prevUV = screenToUv(prevPos.xy);
 				var prevUV = screenToUv(prevPos.xy);
-				
+
 				if( prevUV.x <= 1.0 && prevUV.x >= 0.0 && prevUV.y <= 1.0 && prevUV.y >= 0.0 ) {
 				if( prevUV.x <= 1.0 && prevUV.x >= 0.0 && prevUV.y <= 1.0 && prevUV.y >= 0.0 ) {
 					var prevVal = prev.get(prevUV).rgb;
 					var prevVal = prev.get(prevUV).rgb;
 					pixelColor.rgb = min(mix(curVal, prevVal, strength), maxIntensity);
 					pixelColor.rgb = min(mix(curVal, prevVal, strength), maxIntensity);
@@ -146,6 +146,8 @@ class TemporalBloom extends RendererFX {
 	var prevResult : h3d.mat.Texture;
 	var prevResult : h3d.mat.Texture;
 	var prevCamMat : h3d.Matrix;
 	var prevCamMat : h3d.Matrix;
 
 
+	var tonemap = new Bloom.BloomTonemap();
+
 	public function new(?parent) {
 	public function new(?parent) {
 		super(parent);
 		super(parent);
 		props = ({
 		props = ({
@@ -161,7 +163,7 @@ class TemporalBloom extends RendererFX {
 		prevCamMat.identity();
 		prevCamMat.identity();
 	}
 	}
 
 
-	override function apply(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
+	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		if( step == BeforeTonemapping ) {
 		if( step == BeforeTonemapping ) {
 			r.mark("TBloom");
 			r.mark("TBloom");
 			var pb : TemporalBloomProps = props;
 			var pb : TemporalBloomProps = props;
@@ -169,7 +171,7 @@ class TemporalBloom extends RendererFX {
 
 
 			var source = r.allocTarget("source", false, pb.size, RGBA16F);
 			var source = r.allocTarget("source", false, pb.size, RGBA16F);
 			ctx.engine.pushTarget(source);
 			ctx.engine.pushTarget(source);
-			thresholdPass.shader.hdr = ctx.getGlobal("hdr");
+			thresholdPass.shader.hdr = ctx.getGlobal("hdrMap");
 			thresholdPass.shader.threshold = pb.threshold;
 			thresholdPass.shader.threshold = pb.threshold;
             thresholdPass.shader.intensity = pb.intensity;
             thresholdPass.shader.intensity = pb.intensity;
 			thresholdPass.shader.maxIntensity = pb.maxValue;
 			thresholdPass.shader.maxIntensity = pb.maxValue;
@@ -193,7 +195,7 @@ class TemporalBloom extends RendererFX {
 				thresholdPass.render();
 				thresholdPass.render();
 				ctx.engine.popTarget();
 				ctx.engine.popTarget();
 			}
 			}
-				
+
 			var curSize = pb.size;
 			var curSize = pb.size;
 			var curTarget : h3d.mat.Texture = source;
 			var curTarget : h3d.mat.Texture = source;
 			for( i in 0 ... pb.downScaleCount ) {
 			for( i in 0 ... pb.downScaleCount ) {
@@ -217,7 +219,7 @@ class TemporalBloom extends RendererFX {
 				ctx.engine.popTarget();
 				ctx.engine.popTarget();
 			}
 			}
 
 
-			ctx.setGlobal("bloom", curTarget);
+			r.addShader(tonemap);
 		}
 		}
 	}
 	}
 
 

+ 2 - 2
hrt/shader/Bloom.hx

@@ -4,13 +4,13 @@ class Bloom extends h3d.shader.ScreenShader {
 
 
 	static var SRC = {
 	static var SRC = {
 
 
-		@param var hdr : Sampler2D;
+		@param var texture : Sampler2D;
 		@param var threshold : Float;
 		@param var threshold : Float;
 		@param var intensity : Float;
 		@param var intensity : Float;
 		@param var colorMatrix : Mat4;
 		@param var colorMatrix : Mat4;
 
 
 		function fragment() {
 		function fragment() {
-			pixelColor = hdr.get(calculatedUV);
+			pixelColor = texture.get(calculatedUV);
 			var lum = pixelColor.rgb.dot(vec3(0.2126, 0.7152, 0.0722));
 			var lum = pixelColor.rgb.dot(vec3(0.2126, 0.7152, 0.0722));
 			if( lum < threshold ) pixelColor.rgb = vec3(0.) else pixelColor.rgb *= (lum - threshold) / lum;
 			if( lum < threshold ) pixelColor.rgb = vec3(0.) else pixelColor.rgb *= (lum - threshold) / lum;
 			pixelColor.rgb *= intensity;
 			pixelColor.rgb *= intensity;