2
0
Эх сурвалжийг харах

[DECAL] Exposing localPos as calculatedUV.

clandrin 3 жил өмнө
parent
commit
039c7cecc9

+ 42 - 35
h3d/shader/pbr/VolumeDecal.hx

@@ -35,31 +35,35 @@ class DecalOverlay extends hxsl.Shader {
 		var pixelTransformedPosition : Vec3;
 		var pixelTransformedPosition : Vec3;
 		var projectedPosition : Vec4;
 		var projectedPosition : Vec4;
 		var localPos : Vec3;
 		var localPos : Vec3;
+		var fadeFactor : Float;
 
 
 		function outsideBounds() : Bool {
 		function outsideBounds() : Bool {
 			return ( localPos.x > 0.5 || localPos.x < -0.5 || localPos.y > 0.5 || localPos.y < -0.5 || localPos.z > 0.5 || localPos.z < -0.5 );
 			return ( localPos.x > 0.5 || localPos.x < -0.5 || localPos.y > 0.5 || localPos.y < -0.5 || localPos.z > 0.5 || localPos.z < -0.5 );
 		}
 		}
 
 
-		function fragment() {
-
-			var matrix = camera.inverseViewProj * global.modelViewInverse;
-			var screenPos = projectedPosition.xy / projectedPosition.w;
-			var depth = depthMap.get(screenToUv(screenPos));
-			var ruv = vec4( screenPos, depth, 1 );
-			var wpos = ruv * matrix;
-			var ppos = ruv * camera.inverseViewProj;
-
-			pixelTransformedPosition = ppos.xyz / ppos.w;
-			localPos = (wpos.xyz / wpos.w);
-			calculatedUV = localPos.xy;
-			var fadeFactor = 1 - clamp( pow( max( 0.0, abs(localPos.z * 2) - fadeStart) / (fadeEnd - fadeStart), fadePower), 0, 1);
-
-			if( CENTERED )
-				calculatedUV += 0.5;
-
-			if(	outsideBounds() )
-				discard;
+		function __init__fragment() {
+			{
+				var matrix = camera.inverseViewProj * global.modelViewInverse;
+				var screenPos = projectedPosition.xy / projectedPosition.w;
+				var depth = depthMap.get(screenToUv(screenPos));
+				var ruv = vec4( screenPos, depth, 1 );
+				var wpos = ruv * matrix;
+				var ppos = ruv * camera.inverseViewProj;
+
+				pixelTransformedPosition = ppos.xyz / ppos.w;
+				localPos = (wpos.xyz / wpos.w);
+				calculatedUV = localPos.xy;
+				fadeFactor = 1 - clamp( pow( max( 0.0, abs(localPos.z * 2) - fadeStart) / (fadeEnd - fadeStart), fadePower), 0, 1);
+
+				if( CENTERED )
+					calculatedUV += 0.5;
+
+				if(	outsideBounds() )
+					discard;
+			}
+		}
 
 
+		function fragment() {
 			var color = colorTexture.get(calculatedUV);
 			var color = colorTexture.get(calculatedUV);
 			pixelColor.rgb *= color.rgb;
 			pixelColor.rgb *= color.rgb;
 			if( GAMMA_CORRECT ) pixelColor.rgb *= pixelColor.rgb;
 			if( GAMMA_CORRECT ) pixelColor.rgb *= pixelColor.rgb;
@@ -138,6 +142,24 @@ class DecalPBR extends hxsl.Shader {
 			output.normalStrength = USE_NORMAL ? normalStrength * pixelColor.a * fadeFactor : 0.0;
 			output.normalStrength = USE_NORMAL ? normalStrength * pixelColor.a * fadeFactor : 0.0;
 			output.pbrStrength = pbrStrength * pixelColor.a * fadeFactor;
 			output.pbrStrength = pbrStrength * pixelColor.a * fadeFactor;
 			output.emissiveStrength = emissiveStrength * pixelColor.a * fadeFactor;
 			output.emissiveStrength = emissiveStrength * pixelColor.a * fadeFactor;
+
+			{
+				var matrix = camera.inverseViewProj * global.modelViewInverse;
+				var screenPos = projectedPosition.xy / projectedPosition.w;
+				var depth = depthMap.get(screenToUv(screenPos));
+				var ruv = vec4( screenPos, depth, 1 );
+				var wpos = ruv * matrix;
+
+				var localPos = (wpos.xyz / wpos.w);
+				calculatedUV = localPos.xy;
+				fadeFactor = 1 - clamp( pow( max( 0.0, abs(localPos.z * 2) - fadeStart) / (fadeEnd - fadeStart), fadePower), 0, 1);
+
+				if( CENTERED )
+					calculatedUV += 0.5;
+
+				if(	outsideBounds(localPos) )
+					discard;
+			}
 		}
 		}
 
 
 		function getWorlPos( pos : Vec2 ) : Vec3{
 		function getWorlPos( pos : Vec2 ) : Vec3{
@@ -154,28 +176,13 @@ class DecalPBR extends hxsl.Shader {
 
 
 		function fragment() {
 		function fragment() {
 
 
-			var matrix = camera.inverseViewProj * global.modelViewInverse;
-			var screenPos = projectedPosition.xy / projectedPosition.w;
-			var depth = depthMap.get(screenToUv(screenPos));
-			var ruv = vec4( screenPos, depth, 1 );
-			var wpos = ruv * matrix;
-
-			var localPos = (wpos.xyz / wpos.w);
-			calculatedUV = localPos.xy;
-			fadeFactor = 1 - clamp( pow( max( 0.0, abs(localPos.z * 2) - fadeStart) / (fadeEnd - fadeStart), fadePower), 0, 1);
-
-			if( CENTERED )
-				calculatedUV += 0.5;
-
-			if(	outsideBounds(localPos) )
-				discard;
-
 			if( USE_ALBEDO ) {
 			if( USE_ALBEDO ) {
 				var albedo = albedoTexture.get(calculatedUV);
 				var albedo = albedoTexture.get(calculatedUV);
 				pixelColor *= albedo;
 				pixelColor *= albedo;
 			}
 			}
 
 
 			if( USE_NORMAL ) {
 			if( USE_NORMAL ) {
+				var screenPos = projectedPosition.xy / projectedPosition.w;
 				var worldPos = getWorlPos(screenPos);
 				var worldPos = getWorlPos(screenPos);
 				var ddx = worldPos - getWorlPos(screenPos + vec2(global.pixelSize.x, 0));
 				var ddx = worldPos - getWorlPos(screenPos + vec2(global.pixelSize.x, 0));
 				var ddy = worldPos - getWorlPos(screenPos + vec2(0, global.pixelSize.y));
 				var ddy = worldPos - getWorlPos(screenPos + vec2(0, global.pixelSize.y));