Kaynağa Gözat

added ldr tone mapping

Nicolas Cannasse 7 yıl önce
ebeveyn
işleme
daa1a402f4
2 değiştirilmiş dosya ile 37 ekleme ve 1 silme
  1. 11 1
      h3d/scene/pbr/Renderer.hx
  2. 26 0
      h3d/shader/pbr/ToneMapping.hx

+ 11 - 1
h3d/scene/pbr/Renderer.hx

@@ -10,6 +10,7 @@ class Renderer extends h3d.scene.Renderer {
 
 	var slides = new h3d.pass.ScreenFx(new h3d.shader.pbr.Slides());
 	var pbrOut = new h3d.pass.ScreenFx(new h3d.shader.pbr.Lighting.Indirect());
+	var tonemap = new h3d.pass.ScreenFx(new h3d.shader.pbr.ToneMapping());
 	var pbrSun = new h3d.shader.pbr.Light.DirLight();
 	var pbrLightPass : h3d.mat.Pass;
 	var screenLightPass : h3d.pass.ScreenFx<h3d.shader.pbr.PropsImport>;
@@ -20,6 +21,7 @@ class Renderer extends h3d.scene.Renderer {
 
 	public var displayMode : DisplayMode = Pbr;
 	public var irrad : Irradiance;
+	public var exposure(get,set) : Float;
 
 	var output = new h3d.pass.Output("mrt",[
 		Value("output.color"),
@@ -42,6 +44,9 @@ class Renderer extends h3d.scene.Renderer {
 		allPasses.push(shadows);
 	}
 
+	inline function get_exposure() return tonemap.shader.exposure;
+	inline function set_exposure(v:Float) return tonemap.shader.exposure = v;
+
 	function allocFTarget( name : String, size = 0, depth = true ) {
 		return ctx.textures.allocTarget(name, ctx.engine.width >> size, ctx.engine.height >> size, depth, RGBA32F);
 	}
@@ -141,6 +146,11 @@ class Renderer extends h3d.scene.Renderer {
 		draw("lights");
 		pbrProps.isScreen = true;
 
+		var ldr = allocTarget("ldrOutput",0,true);
+		setTarget(ldr);
+		tonemap.shader.hdrTexture = output;
+		tonemap.render();
+
 		draw("overlay");
 		resetTarget();
 
@@ -148,7 +158,7 @@ class Renderer extends h3d.scene.Renderer {
 		switch( displayMode ) {
 
 		case Pbr, MatCap:
-			fxaa.apply(output);
+			fxaa.apply(ldr);
 
 		case Slides:
 

+ 26 - 0
h3d/shader/pbr/ToneMapping.hx

@@ -0,0 +1,26 @@
+package h3d.shader.pbr;
+
+
+class ToneMapping extends ScreenShader {
+
+	static var SRC = {
+
+		@param var hdrTexture : Sampler2D;
+		@param var exposure : Float;
+
+		function fragment() {
+			var color = hdrTexture.get(calculatedUV);
+
+			// reinhard tonemapping
+			color.rgb *= exp(exposure);
+			color.rgb = color.rgb / (color.rgb + vec3(1.));
+
+			// gamma correct
+			color.rgb = color.rgb.pow(vec3(1 / 2.2));
+
+			pixelColor = color;
+		}
+	}
+
+
+}