浏览代码

Add gamma correct for decals and beforeTonemapping materials

ShiroSmith 6 年之前
父节点
当前提交
4bac5a423a
共有 3 个文件被更改,包括 21 次插入2 次删除
  1. 9 2
      h3d/mat/PbrMaterial.hx
  2. 10 0
      h3d/shader/pbr/GammaCorrect.hx
  3. 2 0
      h3d/shader/pbr/VolumeDecal.hx

+ 9 - 2
h3d/mat/PbrMaterial.hx

@@ -168,6 +168,7 @@ class PbrMaterial extends Material {
 		mainPass.removeShader(mainPass.getShader(h3d.shader.pbr.AlphaMultiply));
 		mainPass.removeShader(mainPass.getShader(h3d.shader.Parallax));
 		mainPass.removeShader(mainPass.getShader(h3d.shader.Emissive));
+		mainPass.removeShader(mainPass.getShader(h3d.shader.pbr.GammaCorrect));
 		// Backward compatibility
 		if( !Reflect.hasField(props, "depthTest") ) Reflect.setField(props, "depthTest", Less);
 		if( !Reflect.hasField(props, "colorMask") ) Reflect.setField(props, "colorMask", 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3);
@@ -183,7 +184,7 @@ class PbrMaterial extends Material {
 			Reflect.deleteField(props, "depthFailOp");
 			Reflect.deleteField(props, "stencilPassOp");
 			Reflect.deleteField(props, "stencilCompare");
-		} 
+		}
 	}
 
 	override function refreshProps() {
@@ -196,8 +197,14 @@ class PbrMaterial extends Material {
 			mainPass.setPassName("default");
 		case BeforeTonemapping:
 			mainPass.setPassName("beforeTonemapping");
-			if( props.emissive > 0 ) 
+			if( props.emissive > 0 )
 				mainPass.addShader(new h3d.shader.Emissive(props.emissive));
+			var gc = mainPass.getShader(h3d.shader.pbr.GammaCorrect);
+			if( gc == null ) {
+				gc = new h3d.shader.pbr.GammaCorrect();
+				gc.setPriority(-1);
+				mainPass.addShader(gc);
+			}
 		case AfterTonemapping:
 			mainPass.setPassName("afterTonemapping");
 		case Distortion:

+ 10 - 0
h3d/shader/pbr/GammaCorrect.hx

@@ -0,0 +1,10 @@
+package h3d.shader.pbr;
+
+class GammaCorrect extends hxsl.Shader {
+	static var SRC = {
+		var pixelColor : Vec4;
+		function fragment() {
+			pixelColor.rgb *= pixelColor.rgb;
+		}
+	}
+}

+ 2 - 0
h3d/shader/pbr/VolumeDecal.hx

@@ -28,6 +28,7 @@ class DecalOverlay extends hxsl.Shader {
 		};
 
 		@const var CENTERED : Bool;
+		@const var GAMMA_CORRECT : Bool;
 
 		@global var depthMap : Channel;
 
@@ -71,6 +72,7 @@ class DecalOverlay extends hxsl.Shader {
 
 			var color = colorTexture.get(calculatedUV);
 			pixelColor.rgb *= color.rgb;
+			if( GAMMA_CORRECT ) pixelColor.rgb *= pixelColor.rgb;
 			pixelColor.rgb += pixelColor.rgb * emissive;
 			pixelColor.a = clamp(max(max(pixelColor.r, pixelColor.g), pixelColor.b), 0, 1) * fadeFactor;
 		}