這次要接著講上次的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的秘密 雖然上面寫的不清不楚 不過也算一種紀錄 |