XNA-Shader簡介

XNA-Shader簡介

著色器(Shader):

    Shader可以直接在GPU上執行的指令集,依據功能的不同,可以劃分成處理3D頂點資料的Vertex Shader和處理螢幕像點資料的Pixel Shader。

    對XNA程式來說,Shader是一個小程式,用來撰寫繪圖3D物件所產生的效果,Shader指令經過編譯之後,直接載入到顯示卡上的GPU來執行。

    而GPU實際可以執行的其實是類似組合語言這種低階的Shader指令,而有些Shader是用較為高階的語言寫成,類似C語言的語法來撰寫(例如DirectX支援的HLSL或是Open GL支援的GLSL),這類的Shader需要DirectX先編譯成低階的Shader指令,然後再交由GPU執行。而XNA程式就是使用HLSL來撰寫遊戲效果。

Shader歷史:

    微軟在DirectX7發表的新技術「硬體轉換與投影」(Hardware transform and lighting),這個技術主要是將頂點轉換和燈光的計算將原本CPU執行的工作轉交給GPU來執行,DirectX7的API將一些複雜的狀態,像是燈光、紋理等,都運用在一個Draw函數裡。

    當硬體貼圖和打光被廣泛的運用在個人電腦上的時候,卻也產生了一個缺點,這些燈光的運算和顯示畫面早已經做好在GPU的硬體上了,以致他們顯現的東西都很相近,雖然提升整體的品質,但卻沒有新的東西可以展現。

    DirectX8是微軟第一個提供的可程式化的Shader,這意味著程式設計師可以為自己的程式撰寫一個屬於自己的Shader程式,但由於早期Shader程式都是用一些組合語言來撰寫的,因此較不方便,所以後來微軟就發表了HLSL新的語言,主要是運用類似C的語法來撰寫程式,而不需要去運用到較低階的語言。

    雖然還有其他用來撰寫shader的高階語言,像是OpenGL使用的GLSL (Open GL Shading Language) 或NVidia使用的 Cg 語言等這些都是,但HLSL只能在XNA或是DirectX使用。

XNA的Shader:

    XNA提供了Effect這個類別來處理大部分繪圖著色相關的工作,裡面有提供簡單的Effect類別:BasicEffect。

    使用時必須注意到如果是使用XNA內建的BasicEffect來繪製模型的話,就無需將此三個矩陣變數相乘,只要分別指定到BasicEffect遺傳下來的物件其中的World、View、Projection成員變數即可,它的Shader檔會自動將此三個矩陣變數相乘,也因此當我們要自己撰寫Shader檔案的話,我們就必須在shader(.fx)檔案裡適時將此三個由程式傳過來的三個矩陣做相乘的動作才可以。