Bladeren bron

added PbrShader, use globals for post processes.

Nicolas Cannasse 5 jaren geleden
bovenliggende
commit
05490288db
3 gewijzigde bestanden met toevoegingen van 41 en 48 verwijderingen
  1. 4 23
      hrt/prefab/rfx/DistanceBlur.hx
  2. 5 25
      hrt/prefab/rfx/GenFog.hx
  3. 32 0
      hrt/prefab/rfx/PbrShader.hx

+ 4 - 23
hrt/prefab/rfx/DistanceBlur.hx

@@ -1,6 +1,6 @@
 package hrt.prefab.rfx;
 
-class DistanceBlurShader extends h3d.shader.ScreenShader {
+class DistanceBlurShader extends PbrShader {
 
 	static var SRC = {
 
@@ -16,24 +16,9 @@ class DistanceBlurShader extends h3d.shader.ScreenShader {
 
 		@param var blurredTexture : Sampler2D;
 
-		@ignore @param var depthTexture : Channel;
-		@ignore @param var cameraPos : Vec3;
-		@ignore @param var cameraInverseViewProj : Mat4;
-
-		function getPosition( uv: Vec2 ) : Vec3 {
-			var depth = depthTexture.get(uv);
-			var uv2 = uvToScreen(calculatedUV);
-			var isSky = 1 - ceil(depth);
-			depth = mix(depth, 1, isSky);
-			var temp = vec4(uv2, depth, 1) * cameraInverseViewProj;
-			var originWS = temp.xyz / temp.w;
-			return originWS;
-		}
-
 		function fragment() {
-			var calculatedUV = input.uv;
-			var origin = getPosition(calculatedUV);
-			var distance = (origin - cameraPos).length();
+			var origin = getPosition();
+			var distance = (origin - camera.position).length();
 
 			if( distance > nearEndDistance && distance < farStartDistance )
 				discard;
@@ -94,7 +79,6 @@ class DistanceBlur extends RendererFX {
 		var p : DistanceBlurProps = props;
 		if( step == AfterTonemapping ) {
 			var ctx = r.ctx;
-			var depth : hxsl.ChannelTexture = ctx.getGlobal("depthMap");
 			blurPass.shader.nearStartDistance = p.nearStartDistance;
 			blurPass.shader.nearEndDistance = p.nearEndDistance;
 			blurPass.shader.nearStartIntensity = p.nearStartIntensity;
@@ -111,10 +95,7 @@ class DistanceBlur extends RendererFX {
 				lbrBlur.apply(ctx, lbrBlurred);
 			}
 			blurPass.shader.blurredTexture = lbrBlurred;
-			blurPass.shader.depthTextureChannel = depth.channel;
-			blurPass.shader.depthTexture = depth.texture;
-			blurPass.shader.cameraPos = ctx.camera.pos;
-			blurPass.shader.cameraInverseViewProj.load(ctx.camera.getInverseViewProj());
+			blurPass.setGlobals(ctx);
 			blurPass.render();
 		}
 	}

+ 5 - 25
hrt/prefab/rfx/GenFog.hx

@@ -1,6 +1,6 @@
 package hrt.prefab.rfx;
 
-class GenFogShader extends h3d.shader.ScreenShader {
+class GenFogShader extends PbrShader {
 
 	static var SRC = {
 
@@ -19,27 +19,12 @@ class GenFogShader extends h3d.shader.ScreenShader {
 		@const var usePosition : Bool;
 		@param var position : Vec3;
 
-		@ignore @param var depthTexture : Channel;
-		@ignore @param var cameraPos : Vec3;
-		@ignore @param var cameraInverseViewProj : Mat4;
-
-		function getPosition( uv: Vec2 ) : Vec3 {
-			var depth = depthTexture.get(uv);
-			var uv2 = uvToScreen(calculatedUV);
-			var isSky = 1 - ceil(depth);
-			depth = mix(depth, 1, isSky);
-			var temp = vec4(uv2, depth, 1) * cameraInverseViewProj;
-			var originWS = temp.xyz / temp.w;
-			return originWS;
-		}
-
 		function fragment() {
-			var calculatedUV = input.uv;
-			var origin = getPosition(calculatedUV);
+			var origin = getPosition();
 			var amount = 0.;
 
 			if( distanceScale != 0 ) {
-				var distance = (origin - (usePosition ? position : cameraPos)).length() - cameraDistance;
+				var distance = (origin - (usePosition ? position : camera.position)).length() - cameraDistance;
 				amount += clamp((distance - startDistance) * distanceScale, 0, 1) * distanceOpacity;
 			}
 
@@ -49,7 +34,7 @@ class GenFogShader extends h3d.shader.ScreenShader {
 				amount += clamp((height - startHeight) * heightScale, 0, 1) * heightOpacity;
 			}
 
-			var fogColor = mix(startColor, endColor, amount);
+			var fogColor = mix(startColor, endColor, clamp(amount,0,1));
 			pixelColor = fogColor;
 		}
 
@@ -120,7 +105,6 @@ class GenFog extends RendererFX {
 		if( (step == AfterTonemapping && p.renderMode == "AfterTonemapping") || (step == BeforeTonemapping && p.renderMode == "BeforeTonemapping") ) {
 			r.mark("DistanceFog");
 			var ctx = r.ctx;
-			var depth : hxsl.ChannelTexture = ctx.getGlobal("depthMap");
 
 			fogPass.shader.startDistance = p.startDistance;
 			fogPass.shader.distanceScale = 1 / (p.endDistance - p.startDistance);
@@ -139,12 +123,8 @@ class GenFog extends RendererFX {
 			fogPass.shader.position.set(p.posX, p.posY, p.posZ);
 			fogPass.shader.usePosition = p.usePosition;
 
-			fogPass.shader.depthTextureChannel = depth.channel;
-			fogPass.shader.depthTexture = depth.texture;
-
-			fogPass.shader.cameraPos = ctx.camera.pos;
-			fogPass.shader.cameraInverseViewProj.load(ctx.camera.getInverseViewProj());
 
+			fogPass.setGlobals(ctx);
 			fogPass.render();
 		}
 	}

+ 32 - 0
hrt/prefab/rfx/PbrShader.hx

@@ -0,0 +1,32 @@
+package hrt.prefab.rfx;
+
+class PbrShader extends h3d.shader.ScreenShader {
+
+	static var SRC = {
+
+		@global var depthMap : Channel;
+		@global var occlusionMap : Channel;
+		@global var hdrMap : Channel;
+		@global var camera : {
+			var position : Vec3;
+			var inverseViewProj : Mat4;
+		};
+		@global var global : {
+			var time : Float;
+		};
+
+		function getPositionAt( uv: Vec2 ) : Vec3 {
+			var depth = depthMap.get(uv);
+			var uv2 = uvToScreen(uv);
+			var temp = vec4(uv2, depth, 1) * camera.inverseViewProj;
+			var originWS = temp.xyz / temp.w;
+			return originWS;
+		}
+
+		function getPosition() : Vec3 {
+			return getPositionAt(calculatedUV);
+		}
+
+	};
+
+}