Orihaus

AEON - Specular Function

Jan 28th, 2013
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.08 KB | None | 0 0
  1. fixed CalculateSpecular( fixed3 lDir, fixed3 vDir, fixed3 norm, fixed spec, fixed3 tangent )
  2. {  
  3.     float3 halfVector = normalize( lDir + vDir );
  4.    
  5.     float specDot = saturate( dot( halfVector, norm ) );
  6.     float diffuseDot = saturate( dot( lDir, norm ) );
  7.     float fresnelDot = min( 1.0, dot( vDir, norm ) );
  8.         float dotHTAlphaX = dot( halfVector, tangent ) / _BRDFRoughnessX;
  9.         float dotHBAlphaY = dot( halfVector, cross( norm, tangent ) ) / _BRDFRoughnessY;
  10.    
  11.         float BRDF = sqrt( saturate( diffuseDot / fresnelDot ) )
  12.             * exp( -2.0 * ( dotHTAlphaX * dotHTAlphaX
  13.             + dotHBAlphaY * dotHBAlphaY ) / ( 1.0 + specDot ) );
  14.  
  15.     float rimCore = 1.0 - saturate( fresnelDot );
  16.     float rim = rimCore + ( pow( rimCore, _FresnelPower ) * 2.0 );
  17.     rim *= specDot;
  18.     float doubleSpec = ( ( _SecondaryBlob * pow( specDot, _Gloss * 16.0 ) )
  19.         + ( pow( specDot, _Gloss * 128.0 ) * _PrimaryBlob ) ) * 2.5;
  20.    
  21.         float SpecularCore = lerp( BRDF * 0.75, doubleSpec, _BRDFAmount );
  22.     return spec * ( ( rim * _AmbientRim ) + ( _FresnelMult * rim + _FresnelDilute ) * SpecularCore );
  23. }
Advertisement
Add Comment
Please, Sign In to add comment