維尼的蜂巢

RealTime??!! It’s amazing!!!!

電腦繪圖(三)-基本Lighting-2 十一月 26, 2005

Filed under: 3D Graph — kevinlin @ 9:45 下午

這次要接著講上次的Lighting

上次寫到Gouraud shading,再來就是比gouraud效果好一點點的phong shading

Phong是Gouraud的學生 在Gouraud提出他的shading後

Phong就認為 如果我先求出三角形裡面所有pixel的法向量 再去lighting算出他的顏色 不是會比較好嗎(Gouraud是先拿頂點的法向量去lighting算出頂點的顏色 再給硬體去填裡面的顏色) Phong是自己算裡面每一個pixel的顏色 這樣效果的確是好很多 不過就是需要有GPU來做 pixel shader  這是Phong的示意圖Phong_Shading

因為公式跟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, (float3x3) 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

gouraud_demo

第二張是 Phong

phong_demo

 

 

下回來揭曉bump mapping的秘密  雖然上面寫的不清不楚 不過也算一種紀錄😛

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s