Orihaus

Rimlight-Modulated Alpha (2013 Version)

Nov 17th, 2013
848
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. Shader "Rimlight_Transparent_Base"
  2. {  
  3.         Properties
  4.         {
  5.                 _DiffuseAmount ( "Diffuse Amount", Range( 0.0, 1.0 ) ) = 0.25
  6.                 _RimColor( "Rim Color", Color ) = ( 0.89, 0.945, 1.0, 0.0 )
  7.                 _RimPower( "Rim Power", Range( 0.0,4.0 ) ) = 3.0
  8.                 _SpecAmount ( "Specular Amount", Range( 0.0, 8.0 ) ) = 1.0
  9.                
  10.                 _Alpha( "Alpha", Range( 1.0, 0.00 ) ) = 1.0
  11.                 _AlphaOffset( "Alpha Offset", Range ( 0.0313725490196078, 0.00 ) ) = 0.01
  12.                
  13.                 _FresnelPower ( "Fresnel Power", Range( 0.0, 8.0 ) ) = 8.0
  14.                 _FresnelMult ( "Fresnel Multiplier", Range( 0.0, 1.0 ) ) = 0.75
  15.                 _PrimarySecondary ( "Primary/Secondary Degree", Range( 0.0, 1.0 ) ) = 1.0
  16.                 _Gloss ( "Gloss", Range( 0.0, 2.0 ) ) = 1.0
  17.         }      
  18.    
  19.         SubShader
  20.         {
  21.                 Tags { "Queue" = "Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
  22.  
  23.                 CGPROGRAM
  24.        
  25.                 #pragma target 3.0
  26.                 #pragma surface surf SimpleSpecular alpha noambient nolightmap
  27.                
  28.                 float _Alpha;
  29.                 float _AlphaOffset;
  30.      
  31.                 float4 _RimColor;
  32.  
  33.                 float _Gloss;
  34.                 float _FresnelPower;
  35.                 float _FresnelMult;
  36.                 float _PrimarySecondary;
  37.                 fixed _SpecAmount;
  38.                
  39.                 fixed CalculateSpecular( fixed3 lDir, fixed3 vDir, fixed3 norm, float gloss )
  40.                 {  
  41.                     float3 halfVector = normalize( lDir + vDir );
  42.                     float specDot = saturate( dot( halfVector, norm ) );
  43.                    
  44.                     float primaryBlob = pow( specDot, _Gloss * 128.0 );
  45.                     float secondaryBlob = pow( specDot, _Gloss * 16.0 );
  46.                     float tripleSpec = lerp( primaryBlob, secondaryBlob, _PrimarySecondary );
  47.        
  48.                     return tripleSpec * gloss;
  49.                 }
  50.                
  51.                 fixed4 LightingSimpleSpecular( SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten )
  52.                 {
  53.                     fixed diff = saturate( dot( s.Normal, lightDir ) );
  54.                     fixed spec = CalculateSpecular( lightDir, viewDir, s.Normal, s.Gloss ) * _SpecAmount;
  55.                    
  56.                     fixed4 c;
  57.                     c.rgb = ( s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec ) * atten;
  58.                     c.a = s.Alpha;
  59.                    
  60.                     return c;
  61.                 }
  62.        
  63.                 struct Input
  64.                 {
  65.                         float3 viewDir;
  66.                 };
  67.  
  68.                 float _RimPower;
  69.                 fixed _DiffuseAmount;
  70.        
  71.                 void surf (Input IN, inout SurfaceOutput o)
  72.                 {
  73.                         o.Albedo = _DiffuseAmount;
  74.                         float rim = 1.0 - saturate( dot( normalize( IN.viewDir ), o.Normal ) );
  75.                         o.Gloss = 0.125 + rim;
  76.                         o.Alpha = _Alpha * pow ( rim, _RimPower ) + _AlphaOffset;
  77.                 }
  78.                 ENDCG
  79.         }
  80.         Fallback "Diffuse"
  81. }
Advertisement
Add Comment
Please, Sign In to add comment