Browse Source

- Add blur for cubemap

ShiroSmith 7 years ago
parent
commit
026062271e
3 changed files with 51 additions and 18 deletions
  1. 38 11
      h3d/pass/Blur.hx
  2. 3 4
      h3d/pass/PointShadowMap.hx
  3. 10 3
      h3d/shader/Blur.hx

+ 38 - 11
h3d/pass/Blur.hx

@@ -3,6 +3,13 @@ package h3d.pass;
 @ignore("shader")
 class Blur extends ScreenFx<h3d.shader.Blur> {
 
+	var cubeDir = [ h3d.Matrix.L([0,0,-1,0, 0,-1,0,0, 1,0,0,0]),
+					h3d.Matrix.L([0,0,1,0, 0,-1,0,0, -1,0,0,0]),
+	 				h3d.Matrix.L([1,0,0,0, 0,0,1,0, 0,1,0,0]),
+	 				h3d.Matrix.L([1,0,0,0, 0,0,-1,0, 0,-1,0,0]),
+				 	h3d.Matrix.L([1,0,0,0, 0,-1,0,0, 0,1,0,0]),
+				 	h3d.Matrix.L([-1,0,0,0, 0,-1,0,0, 0,0,-1,0]) ];
+
 	/**
 		How far in pixels the blur will go.
 	**/
@@ -75,12 +82,12 @@ class Blur extends ScreenFx<h3d.shader.Blur> {
 		var tot = 0.;
 		var qadj = hxd.Math.clamp(quality) * 0.7 + 0.3;
 		var width = radius > 0 ? Math.ceil(hxd.Math.max(radius - 1, 1) * qadj / 2) : 0;
-		var sigma = Math.sqrt(radius) * 2;
+		var sigma = Math.sqrt(radius);
 		for( i in 0...width + 1 ) {
 			var i1 = i * 2;
 			var i2 = i == 0 ? 0 : i * 2 - 1;
 			var g1 = gauss(i1, sigma);
-			var g2 = gauss(i2,sigma);
+			var g2 = gauss(i2, sigma);
 			var g = g1 + g2;
 			values[i] = g;
 			offsets[i] = i == 0 ? 0 : (g1 * i1  + g2 * i2) / (g * i * Math.sqrt(qadj));
@@ -125,25 +132,45 @@ class Blur extends ScreenFx<h3d.shader.Blur> {
 		if( output == null ) output = src;
 		if( values == null ) calcValues();
 
-		var tmp = ctx.textures.allocTarget(src.name+"BlurTmp",src.width,src.height,false,src.format);
+		var isCube = src.flags.has(Cube);
+		var faceCount = isCube ? 6 : 1;
+		var tmp = ctx.textures.allocTarget(src.name+"BlurTmp", src.width, src.height, false, src.format, isCube ? [Target, Cube] : [Target]);
 
 		shader.Quality = values.length;
 		shader.values = values;
 		shader.offsets = offsets;
 
-		shader.texture = src;
+		if( isCube ) {
+			shader.cubeTexture = src;
+			shader.isCube = true;
+		}
+		else{
+			shader.texture = src;
+			shader.isCube = false;
+		}
+
 		shader.pixel.set(1 / src.width, 0);
-		engine.pushTarget(tmp);
-		render();
-		engine.popTarget();
+		for(i in 0 ... faceCount){
+			engine.pushTarget(tmp, i);
+			if( isCube ) shader.cubeDir = cubeDir[i];
+			render();
+			engine.popTarget();
+		}
+
+		if( isCube )
+			shader.cubeTexture = tmp;
+		else
+			shader.texture = tmp;
 
-		shader.texture = tmp;
 		shader.pixel.set(0, 1 / src.height);
 		var outDepth = output.depthBuffer;
 		output.depthBuffer = null;
-		engine.pushTarget(output);
-		render();
-		engine.popTarget();
+		for( i in 0 ... faceCount ){
+			engine.pushTarget(output, i);
+			if( isCube ) shader.cubeDir = cubeDir[i];
+			render();
+			engine.popTarget();
+		}
 		output.depthBuffer = outDepth;
 	}
 

+ 3 - 4
h3d/pass/PointShadowMap.hx

@@ -162,12 +162,11 @@ class PointShadowMap extends Shadows {
 				mergePass.render();
 				ctx.engine.popTarget();
 			}
-
-			// To Do
-			//if( blur.radius > 0 && (mode != Mixed || !ctx.computingStatic) )
-				//blur.apply(ctx, texture);
 		}
 
+		if( blur.radius > 0 && (mode != Mixed || !ctx.computingStatic) )
+				blur.apply(ctx, texture);
+
 		if( mode == Mixed && !ctx.computingStatic )
 			texture = merge;
 

+ 10 - 3
h3d/shader/Blur.hx

@@ -22,6 +22,10 @@ class Blur extends ScreenShader {
 		@param @const var hasNormal : Bool;
 		@param var normalTexture : Sampler2D;
 
+		@param @const var isCube : Bool;
+		@param var cubeTexture : SamplerCube;
+		@param var cubeDir : Mat3;
+
 		function fragment() {
 			if( isDepthDependant ) {
 				var pcur = getPosition(input.uv);
@@ -43,13 +47,16 @@ class Blur extends ScreenShader {
 			}
 			else if( isDepth ) {
 				var val = 0.;
-				@unroll for( i in -Quality + 1...Quality )
-					val += unpack(texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i)) * values[i < 0 ? -i : i];
+				@unroll for( i in -Quality + 1...Quality ){
+					if( isCube ) val += unpack(cubeTexture.get(vec3((input.uv + pixel * offsets[i < 0 ? -i : i] * i )* 2.0 - 1.0, 1) * cubeDir)) * values[i < 0 ? -i : i];
+					else val += unpack(texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i)) * values[i < 0 ? -i : i];
+				}
 				output.color = pack(val.min(0.9999999));
 			} else {
 				var color = vec4(0, 0, 0, 0);
 				@unroll for( i in -Quality + 1...Quality )
-					color += texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i) * values[i < 0 ? -i : i];
+					if( isCube ) color += unpack(cubeTexture.get(vec3((input.uv + pixel * offsets[i < 0 ? -i : i] * i )* 2.0 - 1.0, 1) * cubeDir)) * values[i < 0 ? -i : i];
+					else color += unpack(texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i)) * values[i < 0 ? -i : i];
 				output.color = color;
 			}
 			if( hasFixedColor ) {