Преглед на файлове

Adding ChromaticAberration.hx

clementlandrin преди 4 месеца
родител
ревизия
2f7a35a3a7
променени са 1 файла, в които са добавени 93 реда и са изтрити 0 реда
  1. 93 0
      hrt/prefab/rfx/ChromaticAberration.hx

+ 93 - 0
hrt/prefab/rfx/ChromaticAberration.hx

@@ -0,0 +1,93 @@
+package hrt.prefab.rfx;
+
+class ChromaticAberrationShader extends h3d.shader.ScreenShader {
+
+	static var SRC = {
+
+		@const var DEBUG : Bool;
+
+		@param var opacity : Float;
+		@param var radius : Float;
+		@param var softness : Float;
+		@param var intensity : Float;
+
+		@param var ldrCopy : Sampler2D;
+
+		function fragment() {
+			var pos = uvToScreen(calculatedUV);
+			var dist = length(pos);
+			var dir = normalize(pos);
+			var vignettingOpacity = 1 - smoothstep(radius, radius-softness, dist);
+
+			var red = ldrCopy.get(calculatedUV + dir * vignettingOpacity * intensity).r;			
+			var green = ldrCopy.get(calculatedUV).g;			
+			var blue = ldrCopy.get(calculatedUV - dir * vignettingOpacity * intensity).b;
+			pixelColor.rgb = vec3(red, green, blue);
+			pixelColor.a = opacity;
+
+			if ( DEBUG ) {
+				pixelColor.rgb = vec3(vignettingOpacity);
+				pixelColor.a = 1.0;
+			}
+		}
+	}
+}
+
+@:access(h3d.scene.Renderer)
+class ChromaticAberration extends RendererFX {
+
+	@:s var DEBUG : Bool = false;
+	@:s var opacity : Float = 1.0;
+	@:s var intensity : Float = 1.0;
+	@:s var radius : Float = 1.0;
+	@:s var softness : Float = 0.2;
+
+	var pass = new h3d.pass.ScreenFx(new ChromaticAberrationShader());
+
+	override function begin(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
+		if ( step == AfterTonemapping ) {
+			r.mark("ChromaticAberration");
+			
+			var ldrCopy = r.allocTarget("ldrCopy", true, 1.0);
+			h3d.pass.Copy.run(r.ctx.engine.getCurrentTarget(), ldrCopy);
+			pass.shader.ldrCopy = ldrCopy;
+
+			pass.shader.DEBUG = DEBUG;
+			pass.shader.opacity = opacity;
+			pass.shader.radius = radius;
+			pass.shader.softness = softness;
+			pass.shader.intensity = intensity * 0.01;
+
+			pass.pass.setBlendMode(Alpha);
+			pass.render();
+		}
+	}
+
+	#if editor
+
+	override function edit( ctx : hide.prefab.EditContext ) {
+		super.edit(ctx);
+		ctx.properties.add(new hide.Element(
+			'<div class="group" name="Aberration">
+				<dl>
+					<dt>Intensity [%]</dt><dd><input type="range" min="0" max="3" field="intensity"/></dd>
+				</dl>
+			</div>
+			<div class="group" name="Vignetting">
+				<dl>
+					<dt>DEBUG</dt><dd><input type="checkbox" field="DEBUG"/></dd>
+					<dt>Opacity</dt><dd><input type="range" min="0" max="1" field="opacity"/></dd>
+					<dt>Radius</dt><dd><input type="range" min="0" max="1" field="radius"/></dd>
+					<dt>Softness</dt><dd><input type="range" min="0" max="1" field="softness"/></dd>
+				</dl>
+			</div>
+			'), this, function(pname) {
+				ctx.onChange(this, pname);
+		});
+	}
+
+	#end
+
+	static var _ = Prefab.register("rfx.chromaticAberration", ChromaticAberration);
+
+}