소스 검색

Screen outline

trethaller 7 년 전
부모
커밋
a4394d7cc8
1개의 변경된 파일79개의 추가작업 그리고 3개의 파일을 삭제
  1. 79 3
      hide/Renderer.hx

+ 79 - 3
hide/Renderer.hx

@@ -2,6 +2,20 @@ package hide;
 
 // ----- Default Rendering --------------------------------
 
+class DefaultForwardComposite extends h3d.shader.ScreenShader {
+	static var SRC = {
+		@param var texture : Sampler2D;
+		@param var outline : Sampler2D;
+
+		function fragment() {
+			pixelColor = texture.get(calculatedUV);
+			var outval = outline.get(calculatedUV).rgb;
+			if(outval.r > 0.1 && outval.r < 0.5)
+				pixelColor.rgb += outval.rgb * 3.0 + 0.1;
+		}
+	}
+}
+
 class MaterialSetup extends h3d.mat.MaterialSetup {
     override public function createRenderer() {
 	    return new Renderer();
@@ -20,8 +34,21 @@ class MaterialSetup extends h3d.mat.MaterialSetup {
 
 class Renderer extends h3d.scene.DefaultRenderer {
 
+	var composite: h3d.pass.ScreenFx<DefaultForwardComposite>;
+	var outline = new ScreenOutline();
+	var outlineBlur = new h3d.pass.Blur(4);
+
+	public function new() {
+		super();
+		composite = new h3d.pass.ScreenFx(new DefaultForwardComposite());
+	}
+
 	override function render() {
 
+		var output = allocTarget("output");
+		setTarget(output);
+		clear(h3d.Engine.getCurrent().backgroundColor, 1, 0);
+
 		if( has("shadow") )
 			renderPass(shadow,get("shadow"));
 
@@ -36,8 +63,24 @@ class Renderer extends h3d.scene.DefaultRenderer {
 		renderPass(defaultPass, get("additive") );
 		renderPass(defaultPass, getSort("debuggeom") );
 		renderPass(defaultPass, getSort("debuggeom_alpha"));
-        renderPass(defaultPass, get("outline"));
+		renderPass(defaultPass, getSort("overlay") );
 		renderPass(defaultPass, getSort("ui"));
+
+
+		var outlineTex = allocTarget("outlineBlur", false);
+		{
+			var outlineSrcTex = allocTarget("outline", false);
+			setTarget(outlineSrcTex);
+			clear(0);
+			draw("outline");
+			resetTarget();
+			outlineBlur.apply(ctx, outlineSrcTex, outlineTex);
+		}
+
+		resetTarget();
+		composite.shader.texture = output;
+		composite.shader.outline = outlineTex;
+		composite.render();
 	}
 }
 
@@ -74,8 +117,33 @@ class PbrSetup extends h3d.mat.PbrMaterialSetup {
 	}
 }
 
+class ScreenOutline extends h3d.shader.ScreenShader {
+	static var SRC = {
+
+		@param var texture: Sampler2D;
+
+		function vertex() {
+		}
+
+		function fragment() {
+			var uv = input.uv;
+			var outval = texture.get(uv).rgb;
+			if(outval.r > 0.1 && outval.r < 0.5)
+				pixelColor.rgb += outval.rgb*3.0 + 0.1;
+		}
+	};
+}
+
 class PbrRenderer extends h3d.scene.pbr.Renderer {
 
+	var outline = new ScreenOutline();
+	var outlineBlur = new h3d.pass.Blur(4);
+
+	public function new(env) {
+		super(env);
+		tonemap.addShader(outline);
+	} 
+
 	override function getDefaultProps( ?kind : String ) : Any {
 		var props : h3d.scene.pbr.Renderer.RenderProps = super.getDefaultProps(kind);
 		props.sky = Background;
@@ -84,16 +152,24 @@ class PbrRenderer extends h3d.scene.pbr.Renderer {
 
 	override function mainDraw() {
 		output.draw(getSort("default", true));
-		output.draw(get("outlined"));
 		output.draw(getSort("alpha"));
 		output.draw(get("additive"));
+
+		
+		var outlineTex = allocTarget("outline", false);
+		setTarget(outlineTex);
+		clear(0);
+		draw("outline");
+
+		var outlineBlurTex = allocTarget("outlineBlur", false);
+		outlineBlur.apply(ctx, outlineTex, outlineBlurTex);
+		outline.texture = outlineBlurTex;
 	}
 
 	override function postDraw() {
 		defaultPass.draw(getSort("debuggeom"));
 		defaultPass.draw(getSort("debuggeom_alpha"));
 		defaultPass.draw(getSort("overlay"));
-		draw("outline");
 		defaultPass.draw(getSort("ui"));
 	}
 }