纳金网

标题: 高级光照模型 Cook-Torrance [打印本页]

作者: 会飞的鱼    时间: 2012-2-24 14:16
标题: 高级光照模型 Cook-Torrance
//这个shader 实现 Cook_Torrance 高级光照模型
// powered by sbin3776
shader "Sbin/Cook-Torrance"
{
properties{
  _Color ("Main Color", Color) = (1,1,1,1)
  _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
  _BumpMap ("Normalmap", 2D) = "bump" {}
  _Fo("F0",range(0,1))=0.3
  _Dm("Dm",range(0,1))=0.3
  _ISpecular("ISpecular",range(0,0.3))=0.03
}

subshader
{
  tags{"rendertype"="opaque"}
  CGPROGRAM
  #pragma surface surf Cook_Torrance
  #pragma target 3.0
  sampler2D _MainTex;
  sampler2D _BumpMap;
  fixed4 _Color;
  float _Fo;
  float _Dm;
  float _ISpecular;
  
  half4 LightingCook_Torrance(SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten)
  {  
   //calculate diffuse color
   float kd= saturate(dot( normalize(s.Normal),normalize(lightDir)));
   float4 diffuseColor;
   diffuseColor.rgb= kd  * s.Albedo * _LightColor0*  (atten *2);
   diffuseColor.a=1;
   
   //calculate specular color use Cook-Torrance lighting Model
   float3 V= normalize(viewDir);
   float3 L= normalize(lightDir);
   float3 N= normalize(s.Normal);
   float3 H= V+L;
   float Ks= saturate(dot(H,N));
    float F= _Fo+(1-_Fo)*(pow(1-dot(V,H),5));  
    float P=pow(Ks,2);
    float powDm=_Dm*_Dm;   
    float NdotH=Ks;
    float VdotH=saturate(dot(V,H));   
    float D= ( 1.0f/( powDm* pow(NdotH,4)) ) * exp( (P-1)/ ( powDm * P) );   
    float G1=( NdotH * saturate(dot(N,L)) *2 ) /  VdotH;
    float G2 = ( NdotH * saturate(dot(N,V)) *2 ) /  VdotH;
    float G= min(min(1,G1),G2);
        float4 cook_Torrance_Color= _LightColor0* ( F*D*G / (dot(N,V)* dot(N,L)) ) * _ISpecular * saturate(dot(N,L))* atten;
    half4 c;
   c= diffuseColor + cook_Torrance_Color ;
   c.a= 1;
   return c;
    }
    struct Input {
   float2 uv_MainTex;
   float2 uv_BumpMap;
  };
  void surf(Input IN,inout SurfaceOutput o)
  {
   fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
   o.Albedo = _Color.rgb * tex.rgb ;
   o.Gloss = tex.a;
   o.Alpha = tex.a * _Color.a;
   o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
  }
  
  ENDCG
}
Fallback "Diffuse"
}




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5