
normal為什麼必須要乘上world matrix的inverse和transpose之後的矩陣,而不是直接乘上world matrix。其實我以前也搞不懂,為什麼有些Shader上是將World Matrix定義為invtransposeWorldMatrix(大致上是這樣定義)而有些卻是直接定義為WorldMatrix(大致上是這樣定義)。在看了Real-Time Rendering之後了解到真正的用意是什麼,將說明如下
這張圖的左邊是一個三角形物體,在這個斜邊上的Normal垂直於斜邊。但是在經過non-uniform scale之後就會像右圖一樣因為縮放的關係像上延伸,因此斜邊上的Normal已經沒有跟斜編成垂直的。怎麼樣,很可怕是吧,如果這時候利用這個normal來做各種計算,所得到的結果都將是錯誤的。
那要怎麼避免呢,首先我們來了解一下什麼是non-uniform scale。照字面上的意思就是非相等的縮放,也就是在3D空間中(或是2D),每個軸向的縮放值是不一樣的。相對的uniform scale就是個軸向縮放值相等。所以我們知道,只有在non-uniform的狀況下會有這樣的情形發生,所以通常在很多引擎的設計上,會捨棄non-uniform scale,來統一shader的normal計算方式,或是針對各種不同狀況來決定是要執行的shader。






