Parcourir la source

Added Reverse Depth

TothBenoit il y a 1 mois
Parent
commit
9df4f9d3d3
6 fichiers modifiés avec 45 ajouts et 17 suppressions
  1. 5 4
      h3d/Camera.hx
  2. 10 0
      h3d/mat/Pass.hx
  3. 7 1
      h3d/pass/Output.hx
  4. 15 9
      h3d/scene/RenderContext.hx
  5. 5 1
      h3d/scene/Renderer.hx
  6. 3 2
      h3d/scene/pbr/Renderer.hx

+ 5 - 4
h3d/Camera.hx

@@ -51,6 +51,8 @@ class Camera {
 	public var jitterOffsetX : Float = 0.;
 	public var jitterOffsetY : Float = 0.;
 
+	public var reverseDepth = false;
+
 	var minv : Matrix;
 	var mcamInv : Matrix;
 	var mprojInv : Matrix;
@@ -204,14 +206,13 @@ class Camera {
 	**/
 
 	inline public function getUp() : h3d.Vector {
-		var up = new h3d.Vector(); 
+		var up = new h3d.Vector();
 		if ( directions == null ) {
 			directions = new h3d.Matrix();
 			directions._44 = 0;
 		}
 		if ( directions._44 == 0 )
 			calcDirections();
-		
 		up.x = directions._31;
 		up.y = directions._32;
 		up.z = directions._33;
@@ -418,9 +419,9 @@ class Camera {
 			var scale = zoom / Math.tan(halfFovX);
 			m._11 = scale;
 			m._22 = scale * screenRatio;
-			m._33 = zFar / (zFar - zNear);
+			m._33 = reverseDepth ? -zNear / (zFar - zNear) : zFar / (zFar - zNear);
 			m._34 = 1;
-			m._43 = -(zNear * zFar) / (zFar - zNear);
+			m._43 = reverseDepth ? (zNear * zFar) / (zFar - zNear) : -(zNear * zFar) / (zFar - zNear);
 
 			m._31 = jitterOffsetX;
 			m._32 = jitterOffsetY;

+ 10 - 0
h3d/mat/Pass.hx

@@ -372,6 +372,16 @@ class Pass {
 		return selfShadersRec(true);
 	}
 
+	function reverseDepthTest() {
+		depthTest = switch( depthTest ) {
+			case Greater: Less;
+			case GreaterEqual: LessEqual;
+			case Less: Greater;
+			case LessEqual: GreaterEqual;
+			default: depthTest;
+		};
+	}
+
 	public function clone() {
 		var p = new Pass(name, shaders.clone());
 		p.selfShaders = selfShaders;

+ 7 - 1
h3d/pass/Output.hx

@@ -63,7 +63,13 @@ class Output {
 
 	function drawObject( p : h3d.pass.PassObject ) {
 		ctx.drawPass = p;
-		ctx.engine.selectMaterial(p.pass);
+		if( ctx.useReverseDepth ) {
+			p.pass.reverseDepthTest();
+			ctx.engine.selectMaterial(p.pass);
+			p.pass.reverseDepthTest();
+		} else {
+			ctx.engine.selectMaterial(p.pass);
+		}
 		p.obj.drawn = true;
 		@:privateAccess p.obj.draw(ctx);
 	}

+ 15 - 9
h3d/scene/RenderContext.hx

@@ -18,6 +18,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	public var pbrLightPass : h3d.mat.Pass;
 	public var computingStatic : Bool;
 	public var computeVelocity : Bool;
+	public var useReverseDepth : Bool;
 
 	public var lightSystem : h3d.scene.LightSystem;
 	public var extraShaders : hxsl.ShaderList;
@@ -34,6 +35,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	@global("camera.position") var cameraPos : h3d.Vector;
 	@global("camera.projDiag") var cameraProjDiag : h3d.Vector4;
 	@global("camera.projFlip") var cameraProjFlip : Float;
+	@global("camera.projDepth") var cameraProjDepth : Float;
 	@global("camera.viewProj") var cameraViewProj : h3d.Matrix;
 	@global("camera.inverseViewProj") var cameraInverseViewProj : h3d.Matrix;
 	@global("camera.previousViewProj") var cameraPreviousViewProj : h3d.Matrix;
@@ -61,25 +63,29 @@ class RenderContext extends h3d.impl.RenderContext {
 	public function new(scene) {
 		super();
 		this.scene = scene;
+		camera = new h3d.Camera();
 		cachedShaderList = [];
 		cachedPassObjects = [];
 		initGlobals();
 	}
 
 	public function setCamera( cam : h3d.Camera ) {
-		camera = cam;
-		cameraView = cam.mcam;
-		cameraNear = cam.zNear;
-		cameraFar = cam.zFar;
-		cameraProj = cam.mproj;
-		cameraPos = cam.pos;
-		cameraProjDiag = new h3d.Vector4(cam.mproj._11,cam.mproj._22,cam.mproj._33,cam.mproj._44);
+		camera.load(cam);
+		camera.reverseDepth = useReverseDepth;
+		camera.update();
+		cameraView = camera.mcam;
+		cameraNear = camera.zNear;
+		cameraFar = camera.zFar;
+		cameraProj = camera.mproj;
+		cameraPos = camera.pos;
+		cameraProjDiag = new h3d.Vector4(camera.mproj._11,camera.mproj._22,camera.mproj._33,camera.mproj._44);
 		if ( cameraPreviousViewProj == null )
-			cameraPreviousViewProj = cam.m.clone();
+			cameraPreviousViewProj = camera.m.clone();
 		if (cameraJitterOffsets == null)
 			cameraJitterOffsets = new h3d.Vector4( 0.0, 0.0, 0.0, 0.0 );
-		cameraViewProj = cam.m;
+		cameraViewProj = camera.m;
 		cameraInverseViewProj = camera.getInverseViewProj();
+		cameraProjDepth = useReverseDepth ? -1.0 : 1.0;
 	}
 
 	public function setupTarget() {

+ 5 - 1
h3d/scene/Renderer.hx

@@ -102,6 +102,10 @@ class Renderer extends hxd.impl.AnyProps {
 		return ctx.scene.lightSystem;
 	}
 
+	function getDepthClearValue() {
+		return ctx.useReverseDepth ? 0 : 1;
+	}
+
 	@:access(h3d.scene.Object)
 	function depthSort( frontToBack, passes : h3d.pass.PassList ) {
 		var cam = ctx.camera.m;
@@ -110,7 +114,7 @@ class Renderer extends hxd.impl.AnyProps {
 			var w = p.obj.absPos._41 * cam._14 + p.obj.absPos._42 * cam._24 + p.obj.absPos._43 * cam._34 + cam._44;
 			p.depth = w > 0.0 ? z / w : - z / w;
 		}
-		if( frontToBack )
+		if( frontToBack && !ctx.camera.reverseDepth || !frontToBack && ctx.camera.reverseDepth )
 			passes.sort(
 				function(p1, p2) {
 					if ( p1.pass.layer != p2.pass.layer )

+ 3 - 2
h3d/scene/pbr/Renderer.hx

@@ -234,14 +234,15 @@ class Renderer extends h3d.scene.Renderer {
 	}
 
 	function lighting() {
-
+		var oldReverseDepth = ctx.useReverseDepth;
+		ctx.useReverseDepth = false;
 		begin(Shadows);
 		var ls = Std.downcast(getLightSystem(), h3d.scene.pbr.LightSystem);
 		var count = ctx.engine.drawCalls;
 		if( ls != null ) drawShadows(ls);
 		if( ctx.lightSystem != null ) ctx.lightSystem.drawPasses = ctx.engine.drawCalls - count;
 		end();
-
+		ctx.useReverseDepth = oldReverseDepth;
 		if (ls != null) {
 			while (ls.lightingShaders.length != 0)
 				ls.lightingShaders.pop();