該系列文章al by 我就是條狗~~
隨便說點我記得住的曆史,學點曆史是有用的,可以增加興趣最少...
GPU就是圖形處理器,隨著硬體的發展越來越快,GPU的處理能力也今非昔比,現在GPU能夠進行很複雜的資料處理,並且擁有某些CPU不同的處理特性。GPU語言就是用來用來控制GPU處理的一種語言吧...現在基本有兩種,一種是NVIDIA的Cg(C for graphics 圖形C語言)另一種是microsoft的HLSL(high level shader language 進階著色語言 天知道是不是這麼拼的....)其實這兩種是同樣的語言,兩家公司共同開發的,分別實現而已。我寫的這個教程採用HLSL 沒別的,我學的這個...哈哈...
簡單的說了下我知道的曆史,下面是正題。hlsl程式大多有兩個部分組成(怎麼說,算是吧,不過你要非唯寫一個,當然也是成立的,不過對複雜程式,一個是顯然不夠的),一個是頂點程式(vertex shader )另一個是像素程式(pixel shader),這兩個程式從名字上看就知道是分別代替CPU渲染管線中的 頂點處理(vertex processing)和像素處理(pixel processing)的階段工作,讓CPU騰出更多的周期處理複雜的AI 什麼什麼的.cpu刻度是寶貴的.學遊戲的都知道 關於曆史和簡介只說這麼多吧,...
// 頂點程式
// 全域變數
vector color;
// 輸入結構
struct VS_INPUT ... {
vertor position :POSITION;}
// 輸出結構
struct VS_OUTPUT ... {
vertor position : POSITION;
vector color:COLOR;}
// 主函數
VS_OUTPUT main(VS_INPUT) ... {
VS_OUTPUT out;
out.position=VS_INPUT.posintion;
out.color=color;
return out;}
看上面的例子,hlsl的文法和c的文法其實是很像的,所有有c的基礎的話對學習hlsl是非常有協助的
我自己就最喜歡給出例子以後先告訴我怎麼運行,不然看半天枯燥到死我早扔掉書了,所以,我先告訴你怎麼運行一個hlsl頂點程式。
頂點程式儲存為.txt檔案。例如first。tet,建立一個簡單的directx程式,然後可以調用 D3DXCompileShaderFromFile函數從first。tet中編譯一個頂點著色器,具體代碼如下:
IDirect3DVertexShader9 * firstShader = 0 ; // 頂點著色器指標
// 一個常量列表,用於給全域變數賦值
ID3DXCostantTable * firstConstTable = 0 ;
D3DXHANDLE colorHandle = 0 ; // 你猜這個是什麼。。
ID3DXBuffer * shaderbuffer = 0 ;//建立一個buffer,編譯後的shader儲存在這裡
// 另一個buffer用於儲存錯誤資訊,如果有的話
ID3DXBuffer * errorbuffer = 0 ;
// 編譯著色器代碼
D3DXCompileShaderFromFile( " first.tex " ,//頂點程式檔案路徑和檔案名稱
0 ,
0 .
" main " , // 入口函數名
" vs_3_1 " // shader版本號碼
D3DXSHADER_DEBUG, // 採用debug模式編譯
& shaderbuffer, // 指向編譯後的指標
& errorbuffer,
& firstConstTable // 常量列表);
// 接下來建立電調著色器
g_pDevice -> CreatVertexShader((DWORD * )shaderbuffer -> GerBufferPointer, & firstShader);
/**/ /*接下來是對頂點程式中的全域變數賦值,著色器的全域變數被編譯以後放在一個叫做常量列表的結構中,就是ConstTable,也就是編譯函數D3DXCompileShaderFromFile的最後一個參數,具體的賦值過程是通過變數名獲得指向著色器的控制代碼(handle),通過set函數和控制代碼為變數賦值,比如要設定這裡的color就使用 SetVertor ,如果是矩陣那自然就是SetMatrix函數咯,具體過程如下:*/
D3DVEVTOR4 color = ( 1.0f , 1.0f , 0.0f , 1.0f ); // 先定義一個vertor值
colorHandle = frestConstTable -> GetConstantByName( 0 , // 父親指標表示,如果是最進階別即沒有父,就是0
" color " // 變數名);
// 我們先把設定各個變數為預設值,這是個好習慣
firstConstTable -> SetDefaults(g_pDevice);
// 然後設定值
firstConstTable -> SetVertor(g_pDevice,colorHandle, & color);
好了,把這段代碼加到你的渲染代碼裡頭 到這裡,一個頂點程式就寫完了。
其實這個頂點程式什麼也沒幹,唯一的事情就是把顏色設定了一下而已,不過對學習基礎來說,夠了...
也許你要說,那還沒有設定position的值呢,不,這個值不需要設定,而是由程式從要處理的頂點裡頭取得,這也是頂點程式的一個必要的參數,即一定要有position,道理是不言自明的吧
好了,花了我一個多小時啊,寫了這麼點,算是體會到寫書人的痛苦了....