GPU編程入門(一)_編程

來源:互聯網
上載者:User

該系列文章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,道理是不言自明的吧
好了,花了我一個多小時啊,寫了這麼點,算是體會到寫書人的痛苦了....

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.