XNA Model Material – For HLSL

XNA Model Material – For HLSL

以前在寫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效果了。