Ver código fonte

added volume decals shader (currently use constant normal)
adapted shadow and light to be able to use a transformedPosition modified in the fragment shader

ncannasse 10 anos atrás
pai
commit
b7e5c26efc

+ 2 - 0
h3d/shader/BaseMesh.hx

@@ -35,6 +35,7 @@ class BaseMesh extends hxsl.Shader {
 
 		var relativePosition : Vec3;
 		var transformedPosition : Vec3;
+		var pixelTransformedPosition : Vec3;
 		var transformedNormal : Vec3;
 		var projectedPosition : Vec4;
 		var pixelColor : Vec4;
@@ -59,6 +60,7 @@ class BaseMesh extends hxsl.Shader {
 
 		function vertex() {
 			output.position = projectedPosition;
+			pixelTransformedPosition = transformedPosition;
 		}
 
 		function fragment() {

+ 2 - 1
h3d/shader/PointLight.hx

@@ -7,6 +7,7 @@ class PointLight extends hxsl.Shader {
 		var lightColor : Vec3;
 		var lightPixelColor : Vec3;
 		var transformedPosition : Vec3;
+		var pixelTransformedPosition : Vec3;
 		var transformedNormal : Vec3;
 		@param var color : Vec3;
 		@param var params : Vec3; // [constant, linear, quadratic]
@@ -21,7 +22,7 @@ class PointLight extends hxsl.Shader {
 		}
 
 		function fragment() {
-			var dvec = lightPosition - transformedPosition;
+			var dvec = lightPosition - pixelTransformedPosition;
 			var dist2 = dvec.dot(dvec);
 			var dist = dist2.sqrt();
 			lightPixelColor.rgb += color * (transformedNormal.dot(dvec).max(0.) / vec3(dist, dist2, dist * dist2).dot(params));

+ 6 - 1
h3d/shader/Shadow.hx

@@ -12,13 +12,18 @@ class Shadow extends hxsl.Shader {
 		};
 		var pixelColor : Vec4;
 		var transformedPosition : Vec3;
+		var pixelTransformedPosition : Vec3;
 		@private var shadowPos : Vec3;
+		@const var perPixel : Bool;
 
 		function vertex() {
-			shadowPos = transformedPosition * shadow.proj * vec3(0.5, -0.5, 1) + vec3(0.5, 0.5, 0);
+			if( !perPixel ) shadowPos = transformedPosition * shadow.proj * vec3(0.5, -0.5, 1) + vec3(0.5, 0.5, 0);
 		}
 
 		function fragment() {
+
+			var shadowPos = if( perPixel ) pixelTransformedPosition * shadow.proj * vec3(0.5, -0.5, 1) + vec3(0.5, 0.5, 0) else shadowPos;
+
 			var depth = unpack(shadow.map.get(shadowPos.xy));
 
 			#if false

+ 43 - 0
h3d/shader/VolumeDecal.hx

@@ -0,0 +1,43 @@
+package h3d.shader;
+
+class VolumeDecal extends hxsl.Shader {
+
+	static var SRC = {
+
+		@:import BaseMesh;
+
+		@global var depthMap : Sampler2D;
+
+		@param var scale : Vec2;
+		@param var normal : Vec3;
+		var calculatedUV : Vec2;
+
+		function vertex() {
+			transformedNormal = normal;
+		}
+
+		function fragment() {
+			var matrix = camera.inverseViewProj * global.modelViewInverse;
+			var screenPos = projectedPosition.xy / projectedPosition.w;
+			var tuv = screenPos * vec2(0.5, -0.5) + vec2(0.5, 0.5);
+			var ruv = vec4(
+				screenPos,
+				unpack(depthMap.get(tuv)),
+				1
+			);
+			var wpos = ruv * matrix;
+			var ppos = ruv * camera.inverseViewProj;
+			pixelTransformedPosition = ppos.xyz / ppos.w;
+			calculatedUV = scale * (wpos.xy / wpos.w) + 0.5;
+			if( min(min(calculatedUV.x, calculatedUV.y), min(1 - calculatedUV.x, 1 - calculatedUV.y)) < 0 ) discard;
+		}
+
+	};
+
+	public function new() {
+		super();
+		normal.set(0, 0, 1);
+		scale.set(1, 1);
+	}
+
+}