summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader358
1 files changed, 358 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader
new file mode 100644
index 00000000..256a4d66
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader
@@ -0,0 +1,358 @@
+Shader "Hidden/FresnelNode"
+{
+ Properties
+ {
+ _A ("_Normal", 2D) = "white" {}
+ _B ("_Bias", 2D) = "white" {}
+ _C ("_Scale", 2D) = "white" {}
+ _D ("_Power", 2D) = "white" {}
+ _E ("_View", 2D) = "white" {}
+ }
+ SubShader
+ {
+ Pass //not connected world
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ //sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ int _FresnelType;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-saturate(dot(xy,xy)));
+ float3 vertexPos = float3(xy, z);
+ float3 worldNormal = normalize(float3(xy, z));
+ float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //connected world
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ int _FresnelType;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-saturate(dot(xy,xy)));
+ float3 vertexPos = float3(xy, z);
+ float3 worldNormal = tex2D( _A, i.uv );
+ float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //connected tangent
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ int _FresnelType;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-saturate(dot(xy,xy)));
+ float3 vertexPos = float3(xy, z);
+ float3 worldNormal = normalize(float3(xy, z));
+
+ float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x ));
+ float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz;
+ float3 worldTangent = UnityObjectToWorldDir(tangent);
+ float tangentSign = -1;
+ float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign);
+ float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
+ float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
+ float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
+
+ float2 sphereUVs = i.uv;
+
+ sphereUVs.x = (atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5);
+ float3 tangentNormal = tex2D(_A, sphereUVs).xyz;
+
+ worldNormal = fixed3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) );
+
+ float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //not connected half vector
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ //sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ int _FresnelType;
+ float4 _EditorWorldLightPos;
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-(dot(xy,xy)));
+ float3 vertexPos = normalize(float3(xy, z));
+ float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
+ float3 lightDir = normalize( _EditorWorldLightPos.xyz );
+ float3 halfVector = normalize(worldViewDir+lightDir);
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( halfVector, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( halfVector, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( halfVector, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //connected both
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ sampler2D _E;
+ int _FresnelType;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-saturate(dot(xy,xy)));
+ float3 vertexPos = float3(xy, z);
+ float3 worldNormal = tex2D( _A, i.uv );
+ float3 worldViewDir = tex2D( _E, i.uv );;
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //not connected world and light
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ //sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ int _FresnelType;
+ float4 _EditorWorldLightPos;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-(dot(xy,xy)));
+ float3 vertexPos = normalize(float3(xy, z));
+ float3 normal = normalize(vertexPos);
+ float3 worldNormal = UnityObjectToWorldNormal(normal);
+ float3 lightDir = normalize( _EditorWorldLightPos.xyz );
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, lightDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, lightDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, lightDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //connected view
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ sampler2D _E;
+ int _FresnelType;
+
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ 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 worldViewDir = tex2D( _E, i.uv );
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+
+ Pass //not connected half vector with connected view
+ {
+ CGPROGRAM
+ #include "UnityCG.cginc"
+ #pragma vertex vert_img
+ #pragma fragment frag
+
+ //sampler2D _A;
+ sampler2D _B;
+ sampler2D _C;
+ sampler2D _D;
+ sampler2D _E;
+ int _FresnelType;
+ float4 _EditorWorldLightPos;
+ float4 frag(v2f_img i) : SV_Target
+ {
+ float b = tex2D( _B, i.uv ).r;
+ float s = tex2D( _C, i.uv ).r;
+ float pw = tex2D( _D, i.uv ).r;
+
+ float2 xy = 2 * i.uv - 1;
+ float z = -sqrt(1-(dot(xy,xy)));
+ float3 vertexPos = normalize(float3(xy, z));
+ float3 worldViewDir = tex2D( _E, i.uv );
+ float3 lightDir = normalize( _EditorWorldLightPos.xyz );
+ float3 halfVector = normalize(worldViewDir+lightDir);
+
+ float fresnel = 0;
+ if(_FresnelType == 0)
+ fresnel = (b + s*pow(1 - dot( halfVector, worldViewDir ) , pw));
+ else if(_FresnelType == 1)
+ fresnel = (b + (1-b) * pow(1 - dot( halfVector, worldViewDir ) , 5));
+ else if(_FresnelType == 2)
+ {
+ float f0 = pow((1-s)/(1+s),2);
+ fresnel = (f0 + (1-f0) * pow(1 - dot( halfVector, worldViewDir ) , 5));
+ }
+ return fresnel;
+ }
+ ENDCG
+ }
+ }
+}