以前在寫xna的code,都只要簡單的使用basicEffect的效果就好了。
只是各位可能會覺得basic effect對於模型的打光效果可能不是這麼好看(或是太假了)
現行有很多種lighting model(or lighting system)
1. phong lighting
2. Blinn phong lighting
3. Cook-torrance
等等各種的lighting方式,各位可以參考wiki上面的解說。
了解這些lighting model以後,我們會用shader來去計算每個pixel的light值。
以phong lighting來說,我們除了會需要Vertex和normal的資訊以外,我們還需要額外的kd和ks(這兩個數值是存在模型當中。(當然我們需要pass光的方向)
shader中要怎麼樣獲得vertex和normal的資訊?
你可以在將頂點送入shader的時候,跟shader說你現在要餵進去的資料格式,以下面的例子來說
struct VertexShaderInput
{
float4 Position:POSITION0;
};
至於像是kd ks的部分,我們可以在Draw model的時候,取得相關的資訊,或是是先將該資訊額外儲存起來
以取得kd值來說:
vector3 kd = meshPart.Effect.Parameter[“DiffuseColor”].GetValueVector3();
這樣就可以取出模型的kd值出來。
取出來以後可以在由外面丟屬性的方式丟進shader中。
至於這些資訊怎麼取得出來的!? 實際上這些資訊會在content pipeline處理的時期,就會取得相關的資訊,像是kd會存在DiffuseColor這個變數裡面等等。
常用的幾個變數:
kd –> DiffuseColor
ks –> SpecularColor
ns –> SpecularPower
texture –> BasicTexture
所以,大家就可以完成衣些簡單的lighting效果了。
留言列表