ShiroSmith před 6 roky
rodič
revize
bb655758bc
2 změnil soubory, kde provedl 109 přidání a 0 odebrání
  1. 44 0
      h3d/shader/DistanceFog.hx
  2. 65 0
      hxd/prefab/rfx/DistanceFog.hx

+ 44 - 0
h3d/shader/DistanceFog.hx

@@ -0,0 +1,44 @@
+package h3d.shader;
+
+class DistanceFog extends ScreenShader {
+
+	static var SRC = {
+
+		@param var startDistance : Float;
+		@param var endDistance : Float;
+		@param var density : Float;
+		@param var startColor : Vec3;
+		@param var endColor : 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 distance = (origin - cameraPos).length();
+
+			var fog = clamp((distance - startDistance) / (endDistance - startDistance), 0, 1);
+			var fogColor = mix(startColor, endColor, fog);
+			var fogDensity = mix(0, density, fog);
+
+			pixelColor = vec4(fogColor,fogDensity);
+		}
+	};
+
+	public function new() {
+		super();
+	}
+
+}

+ 65 - 0
hxd/prefab/rfx/DistanceFog.hx

@@ -0,0 +1,65 @@
+package hxd.prefab.rfx;
+
+typedef DistanceFogProps = {
+ 	var startDistance : Float;
+	var endDistance : Float;
+	var density : Float;
+	var startColor : Int;
+	var endColor : Int;
+}
+
+class DistanceFog extends RendererFX {
+
+	var fogPass = new h3d.pass.ScreenFx(new h3d.shader.DistanceFog());
+
+	public function new(?parent) {
+		super(parent);
+		props = ({
+			startDistance : 0,
+			endDistance : 100,
+			density : 1.0,
+		 	startColor : 0xffffff,
+	    	endColor : 0xffffff,
+		} : DistanceFogProps);
+
+		fogPass.pass.setBlendMode(Alpha);
+	}
+
+	override function apply(r:h3d.scene.Renderer, step:hxd.prefab.rfx.RendererFX.Step) {
+		if( step == AfterHdr ) {
+			var p : DistanceFogProps = props;
+			var ctx = r.ctx;
+			var depth : hxsl.ChannelTexture = ctx.getGlobal("depthMap");
+
+			fogPass.shader.startDistance = p.startDistance;
+			fogPass.shader.endDistance = p.endDistance;
+			fogPass.shader.startColor = h3d.Vector.fromColor(p.startColor);
+			fogPass.shader.endColor = h3d.Vector.fromColor(p.endColor);
+			fogPass.shader.depthTextureChannel = depth.channel;
+			fogPass.shader.depthTexture = depth.texture;
+			fogPass.shader.density = p.density;
+
+			fogPass.shader.cameraPos = ctx.camera.pos;
+			fogPass.shader.cameraInverseViewProj.load(ctx.camera.getInverseViewProj());
+
+			fogPass.render();
+		}
+	}
+
+	#if editor
+	override function edit( ctx : hide.prefab.EditContext ) {
+		ctx.properties.add(new hide.Element('
+			<dl>
+			<dt>Density</dt><dd><input type="range" min="0" max="1" field="density"/></dd>
+			<dt>Start Distance</dt><dd><input type="range" min="0" max="100" field="startDistance"/></dd>
+			<dt>End Distance</dt><dd><input type="range" min="0" max="100" field="endDistance"/></dd>
+			<dt>Start Color</dt><dd><input type="color" field="startColor"/></dd>
+			<dt>End Color</dt><dd><input type="color" field="endColor"/></dd>
+			</dl>
+		'),props);
+	}
+	#end
+
+	static var _ = Library.register("rfx.distanceFog", DistanceFog);
+
+}