Cg(C for Graphic)語言關鍵字

 摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU編程與CG語言之陽春白雪下里巴人”

 

 

第三章從 GPU 運行原理和數據流程的角度闡述了頂點着色程序和片段着色程序的輸入輸出,即,應用程序(宿主程序)將圖元信息(頂點位置、法向量、紋理座標等)傳遞給頂點着色程序;頂點着色程序基於圖元信息進行座標空間轉換,運算得到的數據傳遞到片段着色程序中;片段着色程序還可以接受從應用程序中傳遞的紋理信息,將這些信息綜合起來計算每個片段的顏色值,最後將這些顏色值輸送到幀緩衝區(或顏色緩衝區)中。

這些是頂點着色程序和片段着色程序的基本功能和數據輸入輸出,實際上現在的着色程序已經可以接受多種數據類型,並靈活的進行各種算法的處理,如,可以接受光源信息(光源位置、強度等)、材質信息(反射係數、折射係數等)、運動控制信息(紋理投影矩陣、頂點運動矩陣等),可以在頂點程序中計算光線的折射方向,並傳遞到片段程序中進行光照計算。

這一章節中,我們將講解Cg 語言通過何種機制確定數據類型和傳遞形式。讀者要抱着如下幾個問題閱讀本章節:

1.      從應用程序傳遞到 GPU 的數據,分爲圖元信息數據(在GPU 處理的基本數據如頂點位置信息等)和其他的離散數據(在GPU 運行流程中不會發生變化,如材質對光的反射、折射信息),這兩種輸入數據如何區分?

2.      從應用程序傳遞到GPU 中的圖元信息如何區分類型,即,頂點程序怎麼知道一個數據是位置數據,而不是法向量數據?

3.      頂點着色程序與片段着色程序之間的數據傳遞如何進行?

7.1 Cg 關鍵字

關鍵字是語言本身所保留的一個字符串集合,用於代表特定的含義,如前面所講到的數據類型關鍵字 int float 等,以及結構體關鍵字 struct Cg 中的關鍵字很多都是照搬 C/C++ 中的關鍵字,不過 Cg 中也創造了一系列獨特的關鍵字,這些關鍵字不但用於指定輸入圖元的數據含義(是位置信息,還是法向量信息),本質也則對應着這些圖元數據存放的硬件資源(寄存器或者紋理),稱之爲語義詞( Semantics ),通常也根據其用法稱之爲綁定語義詞( binding semantics )。

除語義詞外, Cg 中還提供了三個關鍵字, in out inout ,用於表示函數的輸入參數的傳遞方式,稱爲輸入 / 輸出關鍵字,這組關鍵字可以和語義詞合用表達硬件上不同的存儲位置,即同一個語義詞,使用 in 關鍵字修辭和 out 關鍵詞修辭,表示的圖形硬件上不同的寄存器。

Cg 語言還提供兩個修辭符: uniform ,用於指定變量的數據初始化方式; const 關鍵字的含義與 C/C++ 中相同,表示被修辭變量爲常量變量。

下面將分別對上述的關鍵字進行詳細闡述。這一章非常關鍵,尤其是語義詞的使用方法和含義,再小的 Cg 程序都需要使用到語義詞。

7.2 uniform

Cg 語言將輸入數據流分爲兩類(參見文獻[3] Program inputs and Outputs ):

1.      Varying inputs , 即數據流輸入圖元信息的各種組成要素。從應用程序輸入到 GPU 的數據除了頂點位置數據,還有頂點的法向量數據,紋理座標數據等。 Cg 語言提供了一組語義詞,用以表明參數是由頂點的哪些數據初始化的。

2.      Uniform inputs ,表示一些與三維渲染有關的離散信息數據,這些數據通常由應用程序傳入,並通常不會隨着圖元信息的變化而變化,如材質對光的反射信息、運動矩陣等。 Uniform 修辭一個參數,表示該參數的值由外部應用程序初始化並傳入;例如 在參數列表中寫:

 

uniform float brightness,

uniform float4x4 modleWorldProject

 

表示從“外部”傳入一個 float 類型數據,和一個4 階矩陣。“外部”的含義通常是用 OpenGL 或者 DirectX 所編寫的應用程序。

使用 Uniform 修辭的變量,除了數據來源不同外,與其他變量是完全一樣的。

需要注意的一點是: uniform 修辭的變量的值是從外部傳入的,所以在Cg 程序(頂點程序和片段程序)中通常使用 uniform 參數修辭函數形參,不容許聲明一個用 uniform 修辭的局部變量!否則編譯時會出現錯誤提示信息:

Error C5056:’uniform’not allowed on local variable

7.3 const

Cg 語言也提供 const 修辭符,與 C/C++ 中含義一樣,被 const 所修辭的變量在初始化之後不能再去改變它的值。下面的例子程序中有一個聲明爲 const 的變量被賦值修改:

 

const float a = 1.0;

a = 2.0;  // 錯誤

float b = a++; // 錯誤

 

編譯時會出現錯誤提示信息: error C1026: assignment to const variable

const 修辭符與 uniform 修辭符是相互獨立的,對一個變量既可以單獨使用 const 或者 uniform ,也可以同時使用。

7.4 輸入/ 輸出修辭符( in/out/inout

參數傳遞是指:函數調用實參值初始化函數形參的過程。在 C/C++ 中,根據形參值的改變是否會導致實參值的改變,參數傳遞分爲 值傳遞( pass-by-value 引用傳遞( pass-by-reference 。按值傳遞時,函數不會訪問當前調用的實參,函數體處理的是實參的拷貝,也就是形參,所以形參值的改變不會影響實參值;引用傳遞時,函數接收的是實參的存放地址,函數體中改變的是實參的值。 C/C++ 採取指針機制構建引用傳遞,所以通常引用傳遞也稱爲 指針傳遞

 Cg 語言中參數傳遞方式同樣分爲 值傳遞 引用傳遞 ,但指針機制並不被 GPU 硬件所支持,所以 Cg 語言採用不同的語法修辭符來區別 值傳遞 引用傳遞 。這些修辭符分別爲:

1.      in : 修辭一個形參只是用於輸入,進入函數體時被初始化,且該形參值的改變不會影響實參值,這是典型的值傳遞方式。

2.      out : 修辭一個形參只是用於輸出的,進入函數體時並沒有被初始化,這種類型的形參一般是一個函數的運行結果;

3.      inout : 修辭一個形參既用於輸入也用於輸出,這是典型的引用傳遞。

舉例如下:

 

void myFunction(out float x);  // 形參 x ,只是用於輸出

 

void myFunction(inout float x);  // 形參 x ,即用於輸入時初始化,也用於輸出數據

 

void myFunction(in float x);  // 形參 x ,只是用於輸入

 

void myFunction(float x);  / 等價與 in float x ,這種用法和 C/C++ 完全一致

 

 

 

  也可以使用 return 語句來代替 out 修辭符的使用。輸入 / 輸出修辭符通常和語義詞一起使用,表示頂點着色程序和片段着色程序的輸入輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章