summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader103
1 files changed, 103 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader
new file mode 100644
index 00000000..b5fc2b69
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader
@@ -0,0 +1,103 @@
+Shader "Hidden/TriplanarNode"
+{
+ Properties
+ {
+ _A ("_TopTex", 2D) = "white" {}
+ _B ("_MidTex", 2D) = "white" {}
+ _C ("_BotTex", 2D) = "white" {}
+ _D ("_Tilling", 2D) = "white" {}
+ _E ("_Falloff", 2D) = "white" {}
+ }
+ SubShader
+ {
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert_img
+ #pragma fragment frag
+ #pragma target 3.0
+ #include "UnityCG.cginc"
+ #include "UnityStandardUtils.cginc"
+
+ sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ sampler2D _E;
+ float _IsNormal;
+ float _IsSpherical;
+
+ inline float3 TriplanarSamplingCNF( sampler2D topTexMap, sampler2D midTexMap, sampler2D botTexMap, float3 worldPos, float3 worldNormal, float falloff, float tilling )
+ {
+ float3 projNormal = ( pow( abs( worldNormal ), falloff ) );
+ projNormal /= projNormal.x + projNormal.y + projNormal.z;
+ float3 nsign = sign( worldNormal );
+ float negProjNormalY = max( 0, projNormal.y * -nsign.y );
+ projNormal.y = max( 0, projNormal.y * nsign.y );
+ half4 xNorm; half4 yNorm; half4 yNormN; half4 zNorm;
+ xNorm = ( tex2D( midTexMap, tilling * worldPos.zy * float2( nsign.x, 1.0 ) ) );
+ yNorm = ( tex2D( topTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) );
+ yNormN = ( tex2D( botTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) );
+ zNorm = ( tex2D( midTexMap, tilling * worldPos.xy * float2( -nsign.z, 1.0 ) ) );
+ xNorm.xyz = half3( UnpackNormal( xNorm ).xy * float2( nsign.x, 1.0 ) + worldNormal.zy, worldNormal.x ).zyx;
+ yNorm.xyz = half3( UnpackNormal( yNorm ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;
+ zNorm.xyz = half3( UnpackNormal( zNorm ).xy * float2( -nsign.z, 1.0 ) + worldNormal.xy, worldNormal.z ).xyz;
+ yNormN.xyz = half3( UnpackNormal( yNormN ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;
+ return normalize( xNorm.xyz * projNormal.x + yNorm.xyz * projNormal.y + yNormN.xyz * negProjNormalY + zNorm.xyz * projNormal.z );
+ }
+
+ inline float4 TriplanarSamplingCF( sampler2D topTexMap, sampler2D midTexMap, sampler2D botTexMap, float3 worldPos, float3 worldNormal, float falloff, float tilling )
+ {
+ float3 projNormal = ( pow( abs( worldNormal ), falloff ) );
+ projNormal /= projNormal.x + projNormal.y + projNormal.z;
+ float3 nsign = sign( worldNormal );
+ float negProjNormalY = max( 0, projNormal.y * -nsign.y );
+ projNormal.y = max( 0, projNormal.y * nsign.y );
+ half4 xNorm; half4 yNorm; half4 yNormN; half4 zNorm;
+ xNorm = ( tex2D( midTexMap, tilling * worldPos.zy * float2( nsign.x, 1.0 ) ) );
+ yNorm = ( tex2D( topTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) );
+ yNormN = ( tex2D( botTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) );
+ zNorm = ( tex2D( midTexMap, tilling * worldPos.xy * float2( -nsign.z, 1.0 ) ) );
+ return xNorm * projNormal.x + yNorm * projNormal.y + yNormN * negProjNormalY + zNorm * projNormal.z;
+ }
+
+ float4 frag( v2f_img i ) : SV_Target
+ {
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-saturate(dot(xy,xy)));
+ float3 vertexPos = float3(xy, z);
+ float3 normal = normalize(vertexPos);
+ float3 worldNormal = UnityObjectToWorldNormal(normal);
+ float3 worldPos = mul(unity_ObjectToWorld, vertexPos).xyz;
+
+ float falloff = tex2D( _E, xy ).r;
+ float tilling = tex2D( _D, xy ).r * 0.625;
+ float4 triplanar = 1;
+
+ if ( _IsNormal == 1 ) {
+ float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x ));
+ float3 worldTangent = UnityObjectToWorldDir(tangent);
+ float tangentSign = -1;
+ float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign);
+ float3x3 worldToTangent = float3x3( worldTangent, worldBinormal, worldNormal );
+ if ( _IsSpherical == 1 )
+ triplanar.xyz = TriplanarSamplingCNF( _A, _A, _A, worldPos, worldNormal, falloff, tilling );
+ else
+ triplanar.xyz = TriplanarSamplingCNF( _A, _B, _C, worldPos, worldNormal, falloff, tilling );
+
+ triplanar.xyz = mul( worldToTangent, triplanar.xyz );
+ }
+ else
+ {
+ if ( _IsSpherical == 1 )
+ triplanar = TriplanarSamplingCF( _A, _A, _A, worldPos, worldNormal, falloff, tilling );
+ else
+ triplanar = TriplanarSamplingCF( _A, _B, _C, worldPos, worldNormal, falloff, tilling );
+ }
+
+ return triplanar;
+ }
+ ENDCG
+ }
+ }
+}