Orihaus

Main Shader - July 2013

Jul 23rd, 2013
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.51 KB | None | 0 0
  1. Shader "Base_Texture"
  2. {
  3.     Properties  
  4.     {
  5.         _DiffuseAmount ( "Diffuse Amount", Range( 0.0, 1.0 ) ) = 0.25
  6.         _Roughness ( "Diffuse Roughness", Range( 0.0, 1.0 ) ) = 1.0
  7.         _TexAmount ( "Texture Amount", Range( 0.0, 1.0 ) ) = 0.25
  8.         _SpecAmount ( "Specular Amount", Range( 0.0, 16.0 ) ) = 1.0
  9.         _SpecTexAmount ( "Spec Texture Amount", Range( 0.0, 1.0 ) ) = 0.25
  10.         //_MainMap ( "Main Texture", 2D ) = "main" {}
  11.         _Normalmap ( "Normalmap", 2D ) = "normal" {}
  12.         _Specmap ( "Specmap", 2D ) = "spec" {}
  13.        
  14.         _FresnelPower ( "Fresnel Power", Range( 0.0, 4.0 ) ) = 1.0
  15.         _FresnelPrimarySecondary ( "Primary/Secondary Fresnel Degree", Range( 0.0, 1.0 ) ) = 1.0
  16.         //_FresnelTertiary ( "Fresnel Tertiary Infusion", Range( 0.0, 0.25 ) ) = 0.25
  17.         _FresnelBalance ( "Fresnel Balance", Range( 0.0, 1.0 ) ) = 0.25
  18.        
  19.         _FresnelEmitColor ( "Fresnel Emit Color", Color ) = ( 0.89, 0.945, 1.0, 0.0 )
  20.         _FresnelEmitPrimarySecondary ( "Primary/Secondary Emit Fresnel Degree", Range( 0.0, 1.0 ) ) = 1.0
  21.         _FresnelEmitPower ( "Fresnel Emit Power", Range( 0.0, 16.0 ) ) = 8.0
  22.        
  23.         _PrimarySecondary ( "Primary/Secondary Degree", Range( 0.0, 1.0 ) ) = 1.0
  24.         //_Tertiary ( "Tertiary Infusion", Range( 0.0, 0.25 ) ) = 0.25
  25.         _Gloss ( "Gloss", Range( 0.0, 2.0 ) ) = 1.0
  26.     }
  27.        
  28.     SubShader
  29.     {
  30.         Tags
  31.         {
  32.           "Queue"="Geometry+0"
  33.           "IgnoreProjector"="False"
  34.           "RenderType"="Opaque"
  35.         }
  36.  
  37.         Cull Back
  38.         ZWrite On
  39.         ZTest LEqual
  40.  
  41.         CGPROGRAM
  42.         #pragma target 3.0
  43.         #pragma surface surf SimpleSpecular novertexlights fullforwardshadows
  44.         //fullforwardshadows approxview dualforward
  45.        
  46.         float _Gloss;
  47.         float _PrimarySecondary;
  48.         fixed _SpecAmount;
  49.         float _Roughness;
  50.        
  51.         float CalculateGauss( float angleNormalHalf, float blob )
  52.         {
  53.             float exponent = angleNormalHalf / blob;
  54.             exponent = -( exponent * exponent );
  55.             return exp( exponent );
  56.         }
  57.        
  58.         float CalculateSpecular( fixed3 lDir, fixed3 vDir, fixed3 norm, float lightSize, float gloss )
  59.         {    
  60.             fixed n_dot_l = saturate( dot( norm, lDir ) );
  61.             float3 halfVector = normalize( lDir + vDir );
  62.             float specDot = saturate( dot( halfVector, norm ) );
  63.             float angleNormalHalf = acos( dot( halfVector, norm ) );
  64.            
  65.             float fresnel = pow( 1.0 - dot( halfVector, vDir ), 5.0 );
  66.             fresnel = 0.75 + ( 1.0 - fresnel ) * fresnel;
  67.            
  68.             // Gaussian Microfacet Approximation
  69.             float modGloss = gloss + lightSize * _WorldSpaceLightPos0.w;
  70.             float normalisation_term = ( modGloss + 2.0f ) / 8.0f;
  71.            
  72.             float primaryBlob = CalculateGauss( angleNormalHalf, 1.0 / ( modGloss * 8.0 ) );
  73.             float secondaryBlob = CalculateGauss( angleNormalHalf, 1.0 / ( modGloss * 4.0 ) );
  74.            
  75.             float tripleSpec = lerp( primaryBlob, secondaryBlob, _PrimarySecondary );
  76.            
  77.             return fresnel * normalisation_term * tripleSpec * n_dot_l;
  78.         }
  79.        
  80.         float CalculateDiffuse( fixed3 lDir, fixed3 vDir, fixed3 norm )
  81.         {    
  82.             float VdotN = dot( vDir, norm );
  83.             float LdotN = dot( lDir, norm );
  84.        
  85.             float AngleViewNormal = acos( VdotN );
  86.             float AngleLightNormal = acos( LdotN );
  87.             float AngleDifference = saturate( dot( normalize( vDir - norm * VdotN ), normalize( lDir - norm * LdotN ) ) );
  88.            
  89.             float Alpha = max( AngleViewNormal, AngleLightNormal );
  90.             float Beta = min( AngleViewNormal, AngleLightNormal );
  91.            
  92.             float A = 1.0f - ( 0.5f * _Roughness ) / ( _Roughness + 0.33f );
  93.             float B = ( 0.45f * _Roughness ) / ( _Roughness + 0.09f );
  94.            
  95.             float OrenNayar = ( A + B * AngleDifference * sin( Alpha ) * tan( Beta ) ) * saturate( LdotN );
  96.             return OrenNayar;
  97.         }
  98.        
  99.         float _FresnelBalance;
  100.        
  101.         fixed4 LightingSimpleSpecular( SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten )
  102.         {
  103.             float lightDistance = ( 1.0 - pow( atten, _LightColor0.w ) ); //length( _WorldSpaceLightPos0.rgb - s.Albedo ) * _WorldSpaceLightPos0.w;
  104.             fixed spec = CalculateSpecular( lightDir, viewDir, s.Normal, lightDistance, s.Gloss - lerp( s.Specular, 0.0, _FresnelBalance ) ) * _SpecAmount * lerp( s.Specular, 1.0, _FresnelBalance );
  105.             fixed diff = CalculateDiffuse( lightDir, viewDir, s.Normal ) * s.Albedo;
  106.            
  107.             diff = lerp( diff, 0.0, spec );
  108.            
  109.             fixed4 c;
  110.             c.rgb = diff * _LightColor0.rgb;
  111.             c.rgb += _LightColor0.rgb * spec;
  112.             c.rgb *= atten;
  113.             c.a = s.Alpha;
  114.            
  115.             return c;
  116.         }
  117.        
  118.         fixed4 LightingSimpleSpecular_DirLightmap( SurfaceOutput s, fixed4 color, fixed4 scale, fixed3 viewDir, bool surfFuncWritesNormal, out fixed3 specColor )
  119.         {
  120.             UNITY_DIRBASIS
  121.             half3 scalePerBasisVector;
  122.            
  123.             half3 lm = DirLightmapDiffuse( unity_DirBasis, color, scale, s.Normal, surfFuncWritesNormal, scalePerBasisVector );
  124.             half3 lightDir = normalize( scalePerBasisVector.x * unity_DirBasis[0] + scalePerBasisVector.y * unity_DirBasis[1] + scalePerBasisVector.z * unity_DirBasis[2 ]);
  125.            
  126.             specColor = lm * CalculateSpecular( lightDir, viewDir, s.Normal, 1.0f, s.Gloss - lerp( s.Specular, 0.0, _FresnelBalance ) ) * _SpecAmount * lerp( s.Specular, 1.0, _FresnelBalance );
  127.            
  128.             return half4( lm * 0.5, 1.0 );
  129.         }
  130.  
  131.         struct Input
  132.         {
  133.             //float2 uv_MainMap;
  134.             float2 uv_Normalmap;
  135.             float2 uv_Specmap;
  136.             float3 viewDir;
  137.         };
  138.    
  139.         //sampler2D _MainMap;
  140.         sampler2D _Normalmap;
  141.         sampler2D _Specmap;
  142.  
  143.         fixed _SpecTexAmount;
  144.         fixed _TexAmount;
  145.         fixed _DiffuseAmount;
  146.        
  147.         float _FresnelPower;
  148.         float _FresnelPrimarySecondary;
  149.         float4 _FresnelEmitColor;
  150.         float _FresnelEmitPower;
  151.         float _FresnelEmitPrimarySecondary;
  152.  
  153.         void surf( Input IN, inout SurfaceOutput o )
  154.         {
  155.             o.Normal = UnpackNormal( tex2D( _Normalmap, IN.uv_Normalmap ) );
  156.        
  157.             float fresnelDot = saturate( 1.0 - dot( normalize( IN.viewDir ), o.Normal ) );
  158.             float fresnelPrimaryBlob = pow( fresnelDot, _FresnelPower * 2.0 );
  159.             float fresnelSecondaryBlob = pow( fresnelDot, _FresnelPower );
  160.             float fresnel = lerp( fresnelPrimaryBlob, fresnelSecondaryBlob, _FresnelPrimarySecondary );
  161.             //fresnel *= ( _FresnelPower + 2.0f ) / 4.0f;
  162.            
  163.             float emitPrimaryBlob = pow( fresnelDot, _FresnelEmitPower * 2.0 );
  164.             float emitSecondaryBlob = pow( fresnelDot, _FresnelEmitPower );
  165.             float emitFresnel = lerp( emitPrimaryBlob, emitSecondaryBlob, _FresnelEmitPrimarySecondary );
  166.             o.Emission = emitFresnel * _FresnelEmitColor.rgb * ( _FresnelEmitColor.a * 16.0f );
  167.            
  168.             float spec = tex2D( _Specmap, IN.uv_Specmap ).r;
  169.             o.Gloss = lerp( spec, 1.0, _SpecTexAmount ) * _Gloss;
  170.             o.Specular = fresnel;
  171.             o.Albedo = _DiffuseAmount * lerp( spec, 1.0, _TexAmount ) ;
  172.         }
  173.    
  174.         ENDCG
  175.     }
  176.        
  177.     Fallback "Diffuse"
  178. }
Advertisement
Add Comment
Please, Sign In to add comment