浏览代码

Adding depthPrepass property on pbrMaterials.

clementlandrin 1 年之前
父节点
当前提交
606ef726aa
共有 1 个文件被更改,包括 32 次插入10 次删除
  1. 32 10
      h3d/mat/PbrMaterial.hx

+ 32 - 10
h3d/mat/PbrMaterial.hx

@@ -91,7 +91,7 @@ typedef PbrProps = {
 	@:optional var stencilReadMask : Int;
 
 	@:optional var drawOrder : String;
-	@:optional var useChecker : Bool;
+	@:optional var depthPrepass : Bool;
 }
 
 class PbrMaterial extends Material {
@@ -236,8 +236,8 @@ class PbrMaterial extends Material {
 			Reflect.deleteField(props,"drawOrder");
 		if( props.depthWrite == Default )
 		 	Reflect.deleteField(props, "depthWrite");
-		if ( !props.useChecker )
-			Reflect.deleteField(props, "useChecker");
+		if ( !props.depthPrepass )
+			Reflect.deleteField(props, "depthPrepass");
 		if ( props.parallaxSteps == h3d.shader.Parallax.MAX_LAYERS || props.parallaxSteps == 0 )
 			Reflect.deleteField(props, "parallaxSteps");
 		#end
@@ -393,12 +393,34 @@ class PbrMaterial extends Material {
 			p = p.nextPass;
 		}
 
-		if ( texture != null && props.useChecker ) {
-			mainPass.addShader(new h3d.shader.Checker());
-		} else {
-			var s = mainPass.getShader(h3d.shader.Checker);
-			if ( s != null )
-				mainPass.removeShader(s);
+		if ( props.depthPrepass ) {
+			var passName = switch (props.mode) {
+			case PBR:
+				"depthPrepass";
+			case BeforeTonemapping:
+				"beforeTonemappingDepthPrepass";
+			default:
+				null;
+			}
+			if ( passName != null ) {
+				mainPass.depthTest = switch ( mainPass.depthTest ) {
+				case Less:
+					LessEqual;
+				case Greater:
+					GreaterEqual;
+				default:
+					mainPass.depthTest;
+				}
+
+				var p = allocPass(passName);
+				var killAlpha = new h3d.shader.KillAlpha();
+				killAlpha.threshold = 0.5;
+				p.addShader(killAlpha);
+				p.depthWrite = true;
+				p.depthTest = Less;
+				p.culling = mainPass.culling;
+				p.setBlendMode(None);
+			}
 		}
 	}
 
@@ -583,7 +605,7 @@ class PbrMaterial extends Material {
 						${[for( i in 0...layers.length ) '<option value="${layers[i].value}">${layers[i].name}</option>'].join("")}
 					</select>
 				</dd>
-				<dt>Checker</dt><dd><input type="checkbox" field="useChecker"/></dd>
+				<dt>Depth prepass</dt><dd><input type="checkbox" field="depthPrepass"/></dd>
 			</dl>
 		');
 	}