| 
 這次要接著講上次的Lighting 
上次寫到Gouraud shading,再來就是比gouraud效果好一點點的phong shading 
Phong是Gouraud的學生 在Gouraud提出他的shading後 
Phong就認為 如果我先求出三角形裡面所有pixel的法向量 再去lighting算出他的顏色 不是會比較好嗎(Gouraud是先拿頂點的法向量去lighting算出頂點的顏色 再給硬體去填裡面的顏色) Phong是自己算裡面每一個pixel的顏色 這樣效果的確是好很多 不過就是需要有GPU來做 pixel shader  這是Phong的示意圖  
因為公式跟Gouraud一樣 所以直接貼個程式好了  還蠻簡單的 只是本來是算頂點 現在變成算像素  計算量差蠻多的 
VS_OUTPUT PhongVS(float4 inPos  : POSITION, float3 inNorm : NORMAL) {    float4 a;    VS_OUTPUT out1 = (VS_OUTPUT) 0;          a = mul(inPos, mWorld);    out1.pos = mul(inPos, mWVP);    out1.norm = mul(inNorm, (float3×3) mWorld);    out1.lgt = mainLightPosition - a.xyz;    out1.cam = camPosition.xyz - a.xyz; 
   return out1; }    void PhongPS(in float3 vNorm : TEXCOORD0,              in float3 vLgt  : TEXCOORD1,              in float3 vCam  : TEXCOORD2,              out float4 oCol  : COLOR0) {    float3 normDir = normalize(vNorm);    float3 lgtDir = normalize(vLgt);    float3 halfDir = normalize(lgtDir + normalize(vCam));          float diff = saturate(dot(normDir, lgtDir));    float spec = pow(saturate(dot(normDir, halfDir)), power);         // phong shading model    oCol.rgb = ambLgt*amb + diff*mainLightColor*dif + spec*mainLightColor*spe;    oCol.a = dif.a; } 
上面vextex shader是在做座標系統的轉換  下面piexel shader就是在計算顏色了 
下面放兩張圖 比較一下 Gouraud 跟 Phong 
第一張是Gouraud without specular 
  
第二張是 Phong 
  
下回來揭曉bump mapping的秘密  雖然上面寫的不清不楚 不過也算一種紀錄     |