Unity Shader 資料型別和關鍵字

2022-07-29 04:33:09 字數 3508 閱讀 5518

一、基本資料型別: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=;

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;     為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:修辭乙個形參即用於輸入也用於輸出,這是典型的引用傳遞。

Unity Shader(四) 資料型別

幾種常見的資料型別 1 float half fixed 三個都是浮點型 只是精度不一樣 2 integer 整型 3 sampler2d 2d紋理 4 samplercube 3d紋理 高精度型別,32位,通常用於世界座標下的位置,紋理uv,或涉及複雜函式的標量計算,如三角函式 冪運算等。中精度型...

資料型別基礎資料型別

資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...

資料型別 基本資料型別和引用資料型別

一.分類 1,五種簡單資料型別 基本資料型別 number,string,boolean,null,undefined,新增symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。1 undefined 宣告的變...