Cg(C for Graphic)語言關鍵字(轉)

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

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

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

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

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

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

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

7.1 Cg 關鍵字input

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

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

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 修辭符的使用。輸入 \ 輸出修辭符一般和語義詞一塊兒使用,表示頂點着色程序和片斷着色程序的輸入輸出。

相關文章
相關標籤/搜索