Browse Source

Add options for IBL

ShiroSmith 5 years ago
parent
commit
fbbf58d8d7
3 changed files with 44 additions and 9 deletions
  1. 14 4
      h3d/scene/pbr/Environment.hx
  2. 16 0
      h3d/scene/pbr/Renderer.hx
  3. 14 5
      h3d/shader/pbr/Lighting.hx

+ 14 - 4
h3d/scene/pbr/Environment.hx

@@ -53,6 +53,9 @@ class IrradShader extends IrradBase {
 		@param var cubeSize : Float;
 		@param var cubeSize : Float;
 		@param var cubeScaleFactor : Float;
 		@param var cubeScaleFactor : Float;
 
 
+		@param var threshold : Float;
+		@param var scale : Float;
+
 		function cosineWeightedSampling( p : Vec2, n : Vec3 ) : Vec3 {
 		function cosineWeightedSampling( p : Vec2, n : Vec3 ) : Vec3 {
 			var sq = sqrt(1 - p.x);
 			var sq = sqrt(1 - p.x);
 			var alpha = 2 * PI * p.y;
 			var alpha = 2 * PI * p.y;
@@ -95,7 +98,9 @@ class IrradShader extends IrradBase {
 				}
 				}
 				var amount = n.dot(l).saturate();
 				var amount = n.dot(l).saturate();
 				if( amount > 0 ) {
 				if( amount > 0 ) {
-					color += gammaCorrect(envMap.get(l).rgb) * amount;
+					var envMapColor = envMap.get(l).rgb;
+					envMapColor *= mix(1.0, scale, (max( max(envMapColor.r, max(envMapColor.g, envMapColor.b)) - threshold, 0) / max(0.001, (1.0 - threshold))));
+					color += gammaCorrect(envMapColor) * amount;
 					totalWeight += amount;
 					totalWeight += amount;
 				}
 				}
 			}
 			}
@@ -187,6 +192,9 @@ class Environment  {
 	public var specular : h3d.mat.Texture;
 	public var specular : h3d.mat.Texture;
 
 
 	public var power : Float = 1.;
 	public var power : Float = 1.;
+	public var rot : Float = 0.;
+	public var threshold : Float;
+	public var scale : Float;
 
 
 	/*
 	/*
 		Source can be cube map already prepared or a 2D equirectangular map that
 		Source can be cube map already prepared or a 2D equirectangular map that
@@ -213,7 +221,7 @@ class Environment  {
 			}
 			}
 		}
 		}
 		diffSize = 64;
 		diffSize = 64;
-		specSize = 256;
+		specSize = 512;
 		sampleBits = 12;
 		sampleBits = 12;
 	}
 	}
 
 
@@ -228,9 +236,9 @@ class Environment  {
 
 
 		lut = new h3d.mat.Texture(128, 128, [Target], RGBA16F);
 		lut = new h3d.mat.Texture(128, 128, [Target], RGBA16F);
 		lut.setName("irradLut");
 		lut.setName("irradLut");
-		diffuse = new h3d.mat.Texture(diffSize, diffSize, [Cube, Target]);
+		diffuse = new h3d.mat.Texture(diffSize, diffSize, [Cube, Target], RGBA16F);
 		diffuse.setName("irradDiffuse");
 		diffuse.setName("irradDiffuse");
-		specular = new h3d.mat.Texture(specSize, specSize, [Cube, Target, MipMapped, ManualMipMapGen]);
+		specular = new h3d.mat.Texture(specSize, specSize, [Cube, Target, MipMapped, ManualMipMapGen], RGBA16F);
 		specular.setName("irradSpecular");
 		specular.setName("irradSpecular");
 		specular.mipMap = Linear;
 		specular.mipMap = Linear;
 
 
@@ -278,6 +286,8 @@ class Environment  {
 		screen.shader.samplesBits = sampleBits;
 		screen.shader.samplesBits = sampleBits;
 		screen.shader.envMap = env;
 		screen.shader.envMap = env;
 		screen.shader.isSRGB = env.isSRGB();
 		screen.shader.isSRGB = env.isSRGB();
+		screen.shader.threshold = threshold;
+		screen.shader.scale = scale;
 
 
 		var engine = h3d.Engine.getCurrent();
 		var engine = h3d.Engine.getCurrent();
 
 

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

@@ -42,6 +42,9 @@ typedef RenderProps = {
 	var colorGradingLUTSize : Int;
 	var colorGradingLUTSize : Int;
 	var enableColorGrading : Bool;
 	var enableColorGrading : Bool;
 	var envPower : Float;
 	var envPower : Float;
+	var envRot : Float;
+	var envThreshold : Float;
+	var envScale : Float;
 	var exposure : Float;
 	var exposure : Float;
 	var sky : SkyMode;
 	var sky : SkyMode;
 	var tone : TonemapMap;
 	var tone : TonemapMap;
@@ -298,6 +301,7 @@ class Renderer extends h3d.scene.Renderer {
 		pbrDirect.cameraPosition.load(ctx.camera.pos);
 		pbrDirect.cameraPosition.load(ctx.camera.pos);
 		pbrIndirect.cameraPosition.load(ctx.camera.pos);
 		pbrIndirect.cameraPosition.load(ctx.camera.pos);
 		pbrIndirect.emissivePower = props.emissive * props.emissive;
 		pbrIndirect.emissivePower = props.emissive * props.emissive;
+		pbrIndirect.rot = hxd.Math.degToRad(props.envRot);
 		pbrIndirect.irrPower = env.power * env.power;
 		pbrIndirect.irrPower = env.power * env.power;
 		pbrIndirect.irrLut = env.lut;
 		pbrIndirect.irrLut = env.lut;
 		pbrIndirect.irrDiffuse = env.diffuse;
 		pbrIndirect.irrDiffuse = env.diffuse;
@@ -486,6 +490,9 @@ class Renderer extends h3d.scene.Renderer {
 			colorGradingLUTSize : 1,
 			colorGradingLUTSize : 1,
 			enableColorGrading: true,
 			enableColorGrading: true,
 			envPower : 1.,
 			envPower : 1.,
+			envRot : 0.,
+			envThreshold : 1.,
+			envScale : 1.,
 			emissive : 1.,
 			emissive : 1.,
 			exposure : 0.,
 			exposure : 0.,
 			sky : Irrad,
 			sky : Irrad,
@@ -513,6 +520,12 @@ class Renderer extends h3d.scene.Renderer {
 		toneMode = props.tone;
 		toneMode = props.tone;
 		exposure = props.exposure;
 		exposure = props.exposure;
 		env.power = props.envPower;
 		env.power = props.envPower;
+
+		if( props.envScale != env.scale || props.envThreshold != env.threshold ) {
+			env.scale = props.envScale;
+			env.threshold = props.envThreshold;
+			env.compute();
+		}
 		shadows = props.shadows;
 		shadows = props.shadows;
 
 
 		if( props.colorGradingLUT != null )
 		if( props.colorGradingLUT != null )
@@ -570,6 +583,9 @@ class Renderer extends h3d.scene.Renderer {
 							<br/>
 							<br/>
 							<input type="range" min="0" max="2" field="envPower"/>
 							<input type="range" min="0" max="2" field="envPower"/>
 						</dd>
 						</dd>
+					<dt>Rotation</dt><dd><input type="range" min="0" max="360" field="envRot"/></dd>
+					<dt>Threshold</dt><dd><input type="range" min="0" max="1" field="envThreshold"/></dd>
+					<dt>Scale</dt><dd><input type="range" min="0" max="20" field="envScale"/></dd>
 				</div>
 				</div>
 
 
 				<div class="group" name="Params">
 				<div class="group" name="Params">

+ 14 - 5
h3d/shader/pbr/Lighting.hx

@@ -10,6 +10,8 @@ class Indirect extends PropsDefinition {
 		@param var irrSpecularLevels : Float;
 		@param var irrSpecularLevels : Float;
 		@param var irrPower : Float;
 		@param var irrPower : Float;
 
 
+		@param var rot : Float;
+
 		@const var showSky : Bool;
 		@const var showSky : Bool;
 		@const var skyColor : Bool;
 		@const var skyColor : Bool;
 		@param var skyColorValue : Vec3;
 		@param var skyColorValue : Vec3;
@@ -22,6 +24,9 @@ class Indirect extends PropsDefinition {
 		var calculatedUV : Vec2;
 		var calculatedUV : Vec2;
 
 
 		function fragment() {
 		function fragment() {
+			var s = sin(rot);
+			var c = cos(rot);
+	
 			var isSky = normal.dot(normal) <= 0;
 			var isSky = normal.dot(normal) <= 0;
 			if( isSky ) {
 			if( isSky ) {
 				if( showSky ) {
 				if( showSky ) {
@@ -30,7 +35,8 @@ class Indirect extends PropsDefinition {
 						color = skyColorValue;
 						color = skyColorValue;
 					else {
 					else {
 						normal = (vec3( uvToScreen(calculatedUV) * 5. /*?*/ , 1. ) * cameraInvViewProj.mat3x4()).normalize();
 						normal = (vec3( uvToScreen(calculatedUV) * 5. /*?*/ , 1. ) * cameraInvViewProj.mat3x4()).normalize();
-						color = skyMap.get(normal).rgb;
+						var rotatedNormal = vec3(normal.x * c - normal.y * s, normal.x * s + normal.y * c, normal.z);
+						color = skyMap.get(rotatedNormal).rgb;
 					}
 					}
 					pixelColor.rgb += (color * color) * irrPower;
 					pixelColor.rgb += (color * color) * irrPower;
 				} else
 				} else
@@ -42,12 +48,16 @@ class Indirect extends PropsDefinition {
 
 
 				var F0 = pbrSpecularColor;
 				var F0 = pbrSpecularColor;
 				var F = F0 + (max(vec3(1 - roughness), F0) - F0) * exp2( ( -5.55473 * NdV - 6.98316) * NdV );
 				var F = F0 + (max(vec3(1 - roughness), F0) - F0) * exp2( ( -5.55473 * NdV - 6.98316) * NdV );
+				
+				var rotatedNormal = vec3(normal.x * c - normal.y * s, normal.x * s + normal.y * c, normal.z);
 
 
-				if( drawIndirectDiffuse ){
-					diffuse = irrDiffuse.get(normal).rgb * albedo;
+				if( drawIndirectDiffuse ) {
+					diffuse = irrDiffuse.get(rotatedNormal).rgb * albedo;
 				}
 				}
 				if( drawIndirectSpecular ) {
 				if( drawIndirectSpecular ) {
-					var envSpec = textureLod(irrSpecular, reflect(-view,normal), roughness * irrSpecularLevels).rgb;
+					var reflectVec = reflect(-view, normal);
+					var roatetdReflecVec = vec3(reflectVec.x * c - reflectVec.y * s, reflectVec.x * s + reflectVec.y * c, reflectVec.z);
+					var envSpec = textureLod(irrSpecular, roatetdReflecVec, roughness * irrSpecularLevels).rgb;
 					var envBRDF = irrLut.get(vec2(roughness, NdV));
 					var envBRDF = irrLut.get(vec2(roughness, NdV));
 					specular = envSpec * (F * envBRDF.x + envBRDF.y);
 					specular = envSpec * (F * envBRDF.x + envBRDF.y);
 				}
 				}
@@ -57,7 +67,6 @@ class Indirect extends PropsDefinition {
 			}
 			}
 		}
 		}
 	};
 	};
-
 }
 }
 
 
 class Direct extends PropsDefinition {
 class Direct extends PropsDefinition {