Parcourir la source

Adding filmic Tonemapping.

clementlandrin il y a 2 ans
Parent
commit
23577f00ed
2 fichiers modifiés avec 39 ajouts et 0 suppressions
  1. 26 0
      h3d/scene/pbr/Renderer.hx
  2. 13 0
      h3d/shader/pbr/ToneMapping.hx

+ 26 - 0
h3d/scene/pbr/Renderer.hx

@@ -32,6 +32,7 @@ package h3d.scene.pbr;
 @:enum abstract TonemapMap(String) {
 @:enum abstract TonemapMap(String) {
 	var Linear = "Linear";
 	var Linear = "Linear";
 	var Reinhard = "Reinhard";
 	var Reinhard = "Reinhard";
+	var Filmic = "Filmic";
 }
 }
 
 
 typedef RenderProps = {
 typedef RenderProps = {
@@ -42,6 +43,11 @@ typedef RenderProps = {
 	var tone : TonemapMap;
 	var tone : TonemapMap;
 	var emissive : Float;
 	var emissive : Float;
 	var occlusion : Float;
 	var occlusion : Float;
+	var a : Float;
+	var b : Float;
+	var c : Float;
+	var d : Float;
+	var e : Float;
 }
 }
 
 
 class DepthCopy extends h3d.shader.ScreenShader {
 class DepthCopy extends h3d.shader.ScreenShader {
@@ -497,8 +503,16 @@ class Renderer extends h3d.scene.Renderer {
 		tonemap.shader.mode = switch( toneMode ) {
 		tonemap.shader.mode = switch( toneMode ) {
 			case Linear: 0;
 			case Linear: 0;
 			case Reinhard: 1;
 			case Reinhard: 1;
+			case Filmic: 2;
 			default: 0;
 			default: 0;
 		};
 		};
+		if ( toneMode == Filmic ) {
+			tonemap.shader.a = props.a;
+			tonemap.shader.b = props.b;
+			tonemap.shader.c = props.c;
+			tonemap.shader.d = props.d;
+			tonemap.shader.e = props.e;
+		}
 		tonemap.shader.hdrTexture = textures.hdr;
 		tonemap.shader.hdrTexture = textures.hdr;
 	}
 	}
 
 
@@ -705,6 +719,11 @@ class Renderer extends h3d.scene.Renderer {
 			sky : Irrad,
 			sky : Irrad,
 			tone : Linear,
 			tone : Linear,
 			occlusion : 1.,
 			occlusion : 1.,
+			a : 2.51,
+			b : 0.03,
+			c : 2.43,
+			d : 0.59,
+			e : 0.14,
 		};
 		};
 		return props;
 		return props;
 	}
 	}
@@ -746,8 +765,15 @@ class Renderer extends h3d.scene.Renderer {
 						<select field="tone">
 						<select field="tone">
 							<option value="Linear">Linear</option>
 							<option value="Linear">Linear</option>
 							<option value="Reinhard">Reinhard</option>
 							<option value="Reinhard">Reinhard</option>
+							<option value="Filmic">Filmic</option>
 						</select>
 						</select>
 					</dd>
 					</dd>
+					<dt>Filmic a</dt><dd><input type="range" min="0" max="5" field="a"></dd>
+					<dt>Filmic b</dt><dd><input type="range" min="0" max="2" field="b"></dd>
+					<dt>Filmic c</dt><dd><input type="range" min="0" max="5" field="c"></dd>
+					<dt>Filmic d</dt><dd><input type="range" min="0" max="5" field="d"></dd>
+					<dt>Filmic e</dt><dd><input type="range" min="0" max="0.5" field="e"></dd>
+
 				</div>
 				</div>
 
 
 				<div class="group" name="Environment">
 				<div class="group" name="Environment">

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

@@ -10,6 +10,11 @@ class ToneMapping extends ScreenShader {
 		@const var isSRBG : Bool;
 		@const var isSRBG : Bool;
 		@const var mode : Int;
 		@const var mode : Int;
 		@param var invGamma : Float;
 		@param var invGamma : Float;
+		@param var a : Float;
+		@param var b : Float;
+		@param var c : Float;
+		@param var d : Float;
+		@param var e : Float;
 
 
 		var hdrColor : Vec4;
 		var hdrColor : Vec4;
 
 
@@ -27,6 +32,9 @@ class ToneMapping extends ScreenShader {
 			case 1:
 			case 1:
 				// reinhard
 				// reinhard
 				color.rgb = color.rgb / (color.rgb + vec3(1.));
 				color.rgb = color.rgb / (color.rgb + vec3(1.));
+			case 2:
+				// filmic
+				color.rgb = saturate((color.rgb*(a*color.rgb+b))/(color.rgb*(c*color.rgb+d)+e));
 			}
 			}
 			// gamma correct
 			// gamma correct
 			if( !isSRBG )
 			if( !isSRBG )
@@ -42,6 +50,11 @@ class ToneMapping extends ScreenShader {
 		super();
 		super();
 		exposure = 0;
 		exposure = 0;
 		gamma = 2.0;
 		gamma = 2.0;
+		a = 2.51;
+		b = 0.03;
+		c = 2.43;
+		d = 0.59;
+		e = 0.14;
 	}
 	}
 
 
 	function set_exposure(v) {
 	function set_exposure(v) {