ShaderLab開發實戰——Cg語言簡介

上文中介紹了Shader相關基礎概念,想了解的讀者可經過ShaderLab開發實戰——Shader基本概念查看。編程

文章最後還剩一個問題沒有介紹,就是Shader編程語言Cg(C for graphics),本文將介紹Cg的相關知識點。數組

本文主要介紹兩個問題,第一,爲何要使用Cg開發Shader,第二,Cg語言入門知識和學習資料。數據結構

1. 爲何要使用Cg開發Shader編程語言

    在Shader基本概念文章中已經介紹了,目前Shader的實現語言一共有三種,微軟提供的HLSL(High Level Shading Language),OpenGL提供的GLSL(OpenGL Shading Language)以及NIVIDIA聯合提供的Cg(C for graphics)。在Cg出現以前,HLSL和GLSL佔據了整個Shader開發市場。隨着NIVIDIA的GeForce系列顯卡的崛起,其推出的Cg語言取得了巨大的成功。Cg語言是能夠被OpenGL和DirectX普遍支持的圖形處理器編程語言,屬於OpenGL和DirectX的上層語言。能夠說使用Cg編程的Shader能夠在OpenGL和DirectX環境上運行,良好的跨平臺性給開發者提供較大便利。另外Cg語言的易學性也是其一大優點,設計者的初衷也是想將Shader編程想C語言同樣方便,固然還有一個重要緣由是Unity3D中ShaderLab的編寫使用了Cg語言。基於以上緣由,Cg語言不斷受到Shader開發者的青睞,學好Cg語言也是Shader編寫的關鍵。函數

2. Cg語言入門知識和學習資料學習

    這裏首先介紹一下Cg語言的編譯過程。任何的彙編語言或高級語言程序都須要通過編譯程序翻譯成計算機可以理解0、1序列,整個編譯過程分爲靜態編譯和動態編譯,二者的卻別在於編譯成可執行文件後是否須要源碼信息。靜態編譯是指一旦語言編譯成可執行文件,可執行文件運行中就再也不須要源碼信息,動態編譯則相反。Cg語言的編譯一般使用的是動態編譯,固然也支持靜態編譯,NIVIDIA提供的Cg語言編譯程序爲cgc.exe。.net

    cgc首先會將Cg程序翻譯成可被圖形API(OpenGL和Direct3D)支持的形式,而後應用程序使用適當的OpenGL和Direct3D命令將翻譯後的Cg程序傳遞給圖形處理器,OpenGL和Direct3D的驅動程序最終會把它翻譯成圖形處理器所須要的硬件可執行格式。翻譯

   以後本文將從Cg語言數據類型開始講起,介紹Cg語言相關入門知識。設計

    1. Cg數據類型指針

        Cg中支持六種基本數據類型,分別爲float、int、half、fixed、sampler*、bool

        其中float和half分別爲32位和16位的浮點數,int和fixed分別爲32位整形和12定點數,sampler*爲紋理對象,包括sampler2D、sampler3D、samplerRECT以及sampler CUBE等。

        除了基本數據類型,Cg還提供了內置的向量數據類型以及矩陣數據類型

        向量數據類型如float4表示float類型的4元向量,fixed4表示fixed類型的4元向量,這裏注意的是向量長度不能超過4元。

        矩陣數據類型如float4x4表示4*4階矩陣,4*4是矩陣的最大維度。

        在Cg語言中,向量和矩陣爲內置的數據類型,而下面要說的數組則是一種數據結構。

        這裏順便提一下數據結構和數據類型的區別,數據類型是指數據的一種分類,好比說變量爲Int或者float類型等。而數據結構是相互之間存在一種或者多種關係的數據的集合,好比數組結構將同一數據類型的變量儲存在一塊兒,那麼數組就叫作數據結構。

        Cg中經過float a[10]聲明一個包含10個float數據類型元素的數組,能夠經過a.length得到數組長度

        Cg支持結構體類型,一個結構體至關於一種數據類型,能夠定義該類型的變量。結構體生命一strcut開始,緊跟着結構體變量名以及大括號和分號等。

        Cg語言支持強制類型轉換和隱式轉換。當有類型變量和無類型常量進行運算時,無類型常量不進行類型轉換。例如float a=1.0;float b = a+2.0此時2.0不換類型轉換,編譯時做爲float類型。

        可在常量後面加上類型後綴,此時運算須要類型轉換,後綴f表示float,h表示half,x表示fixed。

    2.Cg語言表達式與控制語句

        Cg中的操做符和c語言類似,這裏就不進行過多說明了,附圖:

           此外Cg中還支持了數學操做符、位移操做符、wizzle操做符(".")以及條件操做符。操做符的優先順序如圖:

    

        在控制流語句中,支持條件語句包括if、if-else,循環語句包括while、for、break以及return。

    3.輸入\輸出和語義綁定

        Cg中不存在指針的概念,全部數據一般都是暫存在寄存器中。

        Cg中s的關鍵字不少都是照搬C\C++中的關鍵字。

        in、out、inout用來表示函數輸入參數的傳遞方式。這裏先提一下形參和實參的區別,形參是指定義函數名和函數體時使用的參數,目的是接收調入參數時傳入的參數;實參是指調用函數時,傳入的參數。參數的傳遞分爲值傳遞和引用傳遞,值傳遞時,函數處理的是傳入實參的拷貝,不會影響實參的原值;引用傳遞時,函數處理的是實參的地址(C\C++使用指針,CG中使用in、out、inout關鍵字),會影響原有實參的值。in修飾形參,表示形參只用於輸入,典型的值傳遞。out修飾形參,表示形參只用於函數的輸出,也能夠用return代替out修飾符使用。inout修飾形參,表示形參即用於輸入也用於輸出,典型的引用傳遞。

         const和uniform是獨立的,可同時使用也可單獨使用。

        uniform用來修飾只能由外部應用程序傳入的變量。在Cg中輸入的數據流分爲兩類:第一類Varying inputs表示輸入數據流中圖元信息的各類組成要素,包括頂點位置、法向量以及紋理座標數據等。第二類Uniform數據由外部應用程序初始化並傳入,不會隨着圖元信息的變化而變化。

        const用來修飾變量爲常量變量。表示const修飾的變量初始化以後,其值不會改變。     

        語義詞是數據和寄存器作一個映射關係,是兩個處理階段(頂點程序、片斷程序)之間的輸入\輸出數據和寄存器之間的橋樑,同時語義一般也表示數據的含義,如 POSITION通常表示參數種存放的數據是頂點位置。   語義分爲輸入語句和輸出語句:

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

        POSITION:四元向量,最後一元數據爲1,表示模型空間內的頂點位置座標,在OpenGL中對應接收應用程序傳遞頂點數據的寄存器上。

        NORMAL:四元向量,最後一元數據爲0,表示模型空間中頂點法向量座標,在OpenGL中對應接收應用程序傳遞頂點法向量的寄存器上。

        頂點着色程序的輸出語義及片斷着色程序的輸入語句:

        頂點着色程序的輸出語義會被傳入到片斷着色程序中。

        語義包括POSITION、PSIZE、FOG、COLOR0-COLOR1,TEXCOORD0-TEXCOORD7。

        頂點着色程序中必須綁定一個輸出語義POSITION,做爲裁剪空間中的頂點座標,該數據只被用於光柵化。

        爲了保持頂點着色程序輸出語義和片斷着色程序輸入語義的一致性,推薦使用struct類型數據做爲二者之間的傳遞。例如:

        這裏值得注意的地方是,在頂點着色程序中,輸入語義和輸出語義中都包括一個POSITION語義。二者是不一樣的,前者是應用程序中模型空間中的頂點座標,是用來頂點着色程序對頂點座標進行處理的。後者是頂點着色程序輸出的裁剪空間頂點座標,是用來給片斷程序作光柵化處理的。二者都爲POSITION語義,但做用是不同的。

        片斷着色程序的輸出語義

        片斷着色程序的輸出語義一般只有一個,COLOR做爲該片斷的最終顏色值。

        綁定語義方法

        常見的綁定語義方法有三種:

        1. 聲明在函數形參列表後面。

        2. 聲明在結構體成員變量後面。

   

        3. 聲明在函數聲明後面。

    4.函數與程序設計

        Cg中函數的定義同C\C++中函數的定義方式一致,而且支持函數重載,即經過形參個數和類型進行函數區分。

        Cg中使用數組形參時傳遞的是數組的完整拷貝,C\C++中實際傳入的是指向首元素的指針。數組做爲函數形參時,可沒必要聲明數組長度。如制定長度,調用函數傳入實參數組時須要與函數形參數組長度一致。

        Cg中頂點處理程序和片斷處理程序各提供了一個入口函數,同C\C++中的main()方法類似。經過判斷函數輸入、輸出語義來判斷入口函數。

        Cg中提供了一系列的內建的標準函數庫,分爲5個部分:數學函數、幾何函數、紋理映射函數、偏導數函數以及調試函數。具體函數有哪些,讀者可自行搜索。

    至此,Cg相關的基礎知識已介紹完畢,能夠看出Cg中的不管數據結構,函數語法都與C\C++很類似,建議學習中充分結合OpenGL渲染流程的實現原理。     

相關文章
相關標籤/搜索