Cg(C for Graphic)語言語義詞與語義綁定詳述 (轉)

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

語義詞( Semantic )與語義綁定( Binding Semantics )app

語義詞,表示輸入圖元的數據含義(是位置信息,仍是法向量信息),也代表這些圖元數據存放的硬件資源(寄存器或者紋理緩衝區)。頂點着色程序和片斷着色程序中 Varying inputs 類型的輸入,必須和一個語義詞相綁定,這稱之爲綁定語義( binding semantics )。函數

7.5.1 輸入語義與輸入語義的區別ui

語義概念的提出和圖形流水線工做機制大有關係。從前面所講的 GPU 處理流程中能夠看出,一個階段處理數據,而後傳輸給下一個階段,那麼每一個階段之間的接口是如何肯定的呢?例如:頂點處理器的輸入數據是處於模型空間的頂點數據(位置、法向量),輸出的是投影座標和光照顏色;片斷處理器要將光照顏色作爲輸入,問題是 「 片斷處理器怎麼知道光照顏色值的存放位置 」 ?指針

在高級語言中( C/C++ ),數據從接口的一端流向另外一端,是由於提供了數據存放的內存位置(一般是指針信息);因爲 Cg 語言並不支持指針機制,且圖形硬件處理過程當中,數據一般暫存在寄存器中,故而在 Cg 語言中,經過引入語義綁定( binding semantics )機制,指定數據存放的位置,實際上就是將輸入 \ 輸出數據和寄存器作一個映射關係(在 OpenGL Cg profiles 中是這樣的,但在 DirectX-based Cg profiles 中則並無這種映射關係)。根據輸入語義,圖形處理器從某個寄存器取數據;而後再將處理好的數據,根據輸出語義,放到指定的寄存器。orm

記住這一點:語義,是兩個處理階段(頂點程序、片斷程序)之間的輸入 \ 輸出數據和寄存器之間的橋樑,同時語義一般也表示數據的含義,如 POSITION 通常表示參數種存放的數據是頂點位置。對象

語義,只對兩個處理階段的輸入 \ 輸出數據有意義,也就是說,語義只有在入口函數中才有效,在內部函數(一個階段的內部處理函數,和下一個階段沒有數據傳遞關係)的無效,被忽略( Semantics attached to parameters to non-main functions are ignored(261 頁 ) );接口

語義,分爲輸入語義和輸入語義;輸入語義和輸出語義是有區別的。雖然一些參數常常會使用相同的綁定語義詞,例如:頂點 Shader 的輸入參數, POSITION 指應用程序傳入的頂點位置,而輸出參數使用 POSITION 語義就表示要反饋給硬件光柵器的裁剪空間位置,光柵器把 POSITION 當成一個位置信息。雖然兩個語義都命名爲 POSITION ,但卻對應着圖形流水線上不一樣的寄存器。ip

 

說明:在 OpenGL Cg profiles 中,語義綁定指定了輸入 \ 輸出數據和圖形硬件寄存器之間的對應關係;可是在 DirectX Cg profiles 中,則並不是如此。在文獻【 3 】的第 25 頁寫到:內存

In the OpenGL Cg profiles, binding semantics implicitly specify the mapping of varying inputs to particular hardware registers. However, in DirectX based Cg profiles there is no such implied mapping.

    

     在 文獻【 3 】的第 260 頁寫到:

Often, these predefined names correspond to the names of hardware registers or API

resources

 

 

7.5.2 頂點着色程序的輸入語義

圖 13 所示的這組綁定語義關鍵字被 Cg 語言 的全部 vertex profile 所支持, 一些 profile 支持額外的語義詞。

 

                                                                   POSITION       BLENDWEIGHT

 

                                                                   NORMAL        TANGENT

 

                                                                    BINORMAL      PSIZE

 

                                                                    BLENDINDICES  TEXCOORD0---TEXCOORD7

 

 

圖 13 定點着色程序輸入語義詞

語義詞 POSITION0 等價於 POSITION ,其餘的語義詞也有相似的等價關係。爲了說明語義詞的含義,舉例以下:

 

in float4 modelPos: POSITION

 

表示該參數中的數據是的頂點位置座標(一般位於模型空間),屬於輸入參數,語義詞 POSITION 是輸入語義,若是在 OpenGL 中則對應爲接受應用程序傳遞的頂點數據的寄存器(圖形硬件上)。

 

in float4 modelNormal: NORMAL

 

表示該參數中的數據是頂點法向量座標(一般位於模型空間),屬於輸入參數,語義詞 NORMAL 是輸入語義,若是在 OpenGL 中則對應爲接受應用程序傳遞的頂點法向量的寄存器(圖形硬件上)。

注意,上面的參數都被聲明爲四元向量,一般咱們在應用程序涉及的頂點位置和法向量都是三元向量,至於爲何要將三元向量便爲四元向量,又稱齊次座標,具體請看附錄 A 。頂點位置座標傳入頂點着色程序中轉化爲四元向量,最後一元數據爲 1 ,而頂點法向量傳入頂點着色程序中轉化爲四元向量,最後一元數據爲 0 。

7.5.3 頂點着色程序的輸出語義  

頂點程序的輸出數據被傳入到片段程序中,因此頂點着色程序的輸出語義詞,一般也是片斷程序的輸入語義詞,不過語義詞 POSITION 除外。

下面這些語義詞適用於全部的 Cg vertex profiles 做爲輸出語義和 Cg fragment profiles 的輸入語義: POSITION , PSIZE , FOG,COLOR0-COLOR1, TEXCOORD0-TEXCOORD7 。

頂點着色程序必須聲明一個輸出變量,並綁定 POSITION 語義詞,該變量中的數據將被用於,且只被用於光柵化! 若是沒有聲明一個綁定 POSITION 語義詞的輸出變量,以下所示的代碼:

 

void main_v(float4 position: POSITION,

       //out float4 oposition : POSITION,

       uniform float4x4 modelViewProj)

{

       //oposition = mul(modelViewProj,position);

}

在使用 vp20 和 vp30 編譯時會提示錯誤信息: error C6014: Required output ‘HPOS’ not written 。在使用 vs_2_0 和 vs_3_0 編譯時會提示錯誤信息: error C6014 : Required output ‘POSITION’ not written.

爲了保持頂點程序輸出語義和片斷程序輸入語義的一致性,一般使用相同的 struct 類型數據做爲二者之間的傳遞,這是一種很是方便的寫法,推薦使用。例如:

 

struct VertexIn

{

  float4 position : POSITION;      

  float4 normal   : NORMAL;

 

};

 

 

struct VertexScreen

{

   float4 oPosition : POSITION;

   float4 objectPos     : TEXCOORD0;

   float4 objectNormal   : TEXCOORD1;

};

注意:當使用 struct 結構中的成員變量綁定語義時,須要注意到頂點着色程序中使用的 POSITION 語義詞,是不會被片斷程序所使用的。

若是須要從頂點着色程序向片斷程序傳遞數據,例如頂點投影座標、光照信息等,則能夠聲明另外的參數,綁定到 TEXCOORD 系列的語義詞進行數據傳遞,實際上 TEXCOORD 系列的語義詞一般都被用於從頂點程序向片斷程序之間傳遞數據

固然,你也能夠選擇不使用 struct 結構,而直接在函數形參中進行語義綁定。不管使用何種方式,都要記住 vertex program 中的綁定語義( POSITION 除外)的輸出形參中的數據會傳遞到 fragment program 中綁定相同語義的輸入形參中。

7.5.4 片斷着色程序的輸出語義

片斷着色程序的輸出語義詞較少,一般是 COLOR 。這是由於片斷着色程序運行完畢後,就基本到了 GPU 流水線的末端了。 片斷程序必須聲明一個 out 向量(三元或四元),綁定語義詞 COLOR ,這個值將被用做該片段的最終顏色值。例如:

 

void main_f(out float4 color     : COLOR)

{

 

  color.xyz = float3(1.0,1.0,1.0);

  color.w = 1.0;

}

一些 fragment profile 支持輸出語義詞 DEPTH ,與它綁定的輸出變量會設置片段的深度值;還有一些支持額外的顏色輸出,能夠用於多渲染目標( multiple render targets , MRTs )。

和頂點着色程序同樣,片段着色程序也能夠將輸出對象放入一個結構體中。不過,這種作法未必方便,理由是:片段着色程序的輸出對象少,最經常使用的就是顏色值(綁定輸出語義詞 COLOR ),單獨的一個向量沒有必要放到結構體中。而頂點着色程序輸出的對象不少,在有些光照或陰影計算中,每每要輸出頂點的世界座標、法向量、光的反射方向、折射方向、投影紋理座標等數據,這些數據統一放到結構體中方便管理。

相關文章
相關標籤/搜索