一、基本數據類型:Cg支持7種基本的數據類型
1、float,32位浮點數據,一個符號位。浮點數據類型被所有的圖形接口支持;
2、half,16位浮點數據;
3、int,32位整形數據
4,fixed,12位定點數,
5、bool,布爾數據,被所有的圖形接口支持;
6、sampler*,紋理對象的句柄,分為sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。
二、內置的數據類型
基於基礎數據類型,如float3,表示float類型的三維向量;同理,bool2表示布爾類型的二維向量。
注:向量最長不能超過四元,如float5 vector;//編譯錯誤
向量的賦值:
float2 a=float(1.0,1.0); //編譯通過
float2 a=float(1.0f,1.0f); //編譯錯誤
float3 b=float(a,0.0); //編譯通過
矩陣數據類型:
float1X1 m1; //即float m1,一維矩陣
float3X4 m34 //3*4階矩陣
注:X是字符,不是乘號,最大的維數為4*4階,矩陣的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};
float3 x和floatx[3]是不同的,前者為向量是內置的數據類型,而數組則是一種數據結構,不是內置的數據類型。
三、類型轉換
Cg中的類型轉換有強制轉換和隱式轉換;如果是隱式轉換則數據類型從低精度向高精度轉換。如:
float a=1.0; half b=2.0; loat c=a+b; //等價於float c=a+(float)b;
Cg語言中可以對常量數據加上類型后綴表示該數據類型的數據,如:
float a=1.0h; //1.0h為half類型常量數據
這樣的后綴類型有三種:
f:表示float;
h:表示half;
x:表示fixed;
四、Swizzle操作符
Cg語言中的其他操作符和高級CPU語言C++類似,包括關系操作符、邏輯操作符和位移操作符以及條件操作符。而Swizzle操作符是Cg語言中特有的,它可以將一個向量的成員取出組成一個新的向量。對於坐標或者角度等其他多維向量,Swizzle操作符(.)后接x、y、z、w分別表示原始向量的第一個、第二個、第三個和第四個元素;同樣,對於顏色可以后接r、g、b和a來表示同樣的索引。
例如:
float4(a,b,c,d).xwz 等價於 float(a,d,c)
float4(a,b,c,d).xxy 等價於 float(a,a,b)
注:Swizzle操作符只對結構體和向量使用,不能對數組使用。
五、輸入數據關鍵字:Cg中輸入數據流一般分為兩類
1、varying 參數:在Cg程序中通過語義進行綁定變量, Cg語言提供了一組語義詞,用以表示參數是由頂點的那些數據初始化的,一旦這個變量使用了語義詞進行綁定,那么這個變量值被初始化的同時也意味着它有了特殊的含義,如表示位置、法線等含義。語義提供了一種使用隨頂點變化或隨片段變化而變化的值來初始化Cg程序參數的方法,這些數據都是從應用程序輸入到GPU的數據,如頂點位置、法向量、紋理坐標數據等。
2、Uniform 參數:Uniform是用來限制一個變量的初始值的來源,當聲明一個變量為Uniform類型的時候,表示這個變量的初始值來自於外部的其他環境。除了獲取初始值的這點之外,Uniform關鍵字聲明的變量和其他變量是完全一樣的。通常用Uniform來定義一些與三維渲染有關的離散信息數據,並通常不會隨着圖元信息的變化而變化,如材質對光的反射信息。Uniform表示一個參數,通常使用 uniform表示函數的形參,不能定義一個uniform表示的局部變量。
Unity的內置Uniform輸入參數如下:
uniform float4 _Time, _SinTime, _CosTime; // 時間量
uniform float4 _ProjectionParams; // x = 1 or -1 (如果投影翻轉就是-1)
// y = 近平面; z = 遠平面; w = 1/遠平面
uniform float4 _ScreenParams; // x = width; y = height; z = 1 +1/width; w = 1 + 1/height
uniform float3_WorldSpaceCameraPos;
uniform float4x4 _Object2World; //模型矩陣
uniform float4x4 _World2Object; // 模型矩陣的逆
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range
uniform float4 _WorldSpaceLightPos0; // 光源的位置和方向
uniform float4x4 UNITY_MATRIX_MVP; // 模型視圖投影矩陣
uniform float4x4 UNITY_MATRIX_MV; // 模型視圖矩陣
uniform float4x4 UNITY_MATRIX_V; // 視圖矩陣
uniform float4x4 UNITY_MATRIX_P; // 投影矩陣
uniform float4x4 UNITY_MATRIX_VP; // 視圖投影矩陣
uniform float4x4 UNITY_MATRIX_T_MV; // 模型視圖矩陣的轉置矩陣
uniform float4x4 UNITY_MATRIX_IT_MV; // 模型視圖矩陣的逆矩陣的轉置矩陣
uniform float4x4 UNITY_MATRIX_TEXTURE0; // 貼圖紋理矩陣
uniform float4x4 UNITY_MATRIX_TEXTURE1; //貼圖紋理矩陣
uniform float4x4 UNITY_MATRIX_TEXTURE2; //貼圖紋理矩陣
uniform float4x4 UNITY_MATRIX_TEXTURE3; //貼圖紋理矩陣
uniform float4 UNITY_LIGHTMODEL_AMBIENT; // 環境色
六、輸入輸出
對於程圖形渲染管線,可編程控制的部分只有兩個,頂點着色器和片段着色器。對於編程控制這兩個部分,首要的任務就是要怎么給它們傳參數。Cg語言的參數傳遞同樣也有“值傳遞”和“引用傳遞”之分。因為GPU不支持指針,所以Cg語言采用了如下的方式來修辭參數傳遞:
1、in:修辭一個形參只是用於輸入,進入函數體時被初始化,且該形參值的改變不會影響實參值,傳遞方式為值傳遞。
2、out:修辭一個形參只是用於輸出,進入函數體時沒有被初始化,一般為函數的返回值。
3、inout:修辭一個形參即用於輸入也用於輸出,這是典型的引用傳遞。
