123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- 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"
- #include "Preview.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;
- float3 vertexPos = PreviewFragmentPositionOS( i.uv );
- float3 vertexNormal = PreviewFragmentNormalOS( i.uv );
- float3 worldNormal = UnityObjectToWorldNormal( vertexNormal );
- float3 worldViewDir = normalize(preview_WorldSpaceCameraPos - 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"
- #include "Preview.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;
- float3 vertexPos = PreviewFragmentPositionOS( i.uv );
- float3 worldNormal = tex2D( _A, i.uv );
- float3 worldViewDir = normalize(preview_WorldSpaceCameraPos - 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"
- #include "Preview.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;
- float3 vertexPos = PreviewFragmentPositionOS( i.uv );
- float3 vertexNormal = PreviewFragmentNormalOS( i.uv );
- float3 worldNormal = UnityObjectToWorldNormal( vertexNormal );
- float3 tangent = PreviewFragmentTangentOS( i.uv );
- 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(preview_WorldSpaceCameraPos - 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"
- #include "Preview.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(preview_WorldSpaceCameraPos - 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"
- #include "Preview.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;
- float3 vertexPos = PreviewFragmentPositionOS( i.uv );
- 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"
- #include "Preview.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"
- #include "Preview.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;
- float3 vertexPos = PreviewFragmentPositionOS( i.uv );
- 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"
- #include "Preview.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
- }
- }
- }
|