類型轉換(Casting)
和GLSL ES 3.0一樣,無論是標量(Scalar)還是向量(Vector),即使維度(size)相同,但如果類型不同,也是無法進行隱式(implicit)類型轉換离咐。如果連維度都不同椭懊,則更加不能夠隱式轉換贬丛。所有的類型轉換必須是顯式(explicit)的且基于構造函數(shù)來實現(xiàn)右冻。
例子
float a = 2; // 非法
float a = 2.0; // 合法
float a = float(2); // 合法
默認的整型是有符號的,因此要賦值給無符號整型也需要進行類型轉換
int a = 2; // 合法
uint a = 2; // 非法
uint a = uint(2); // 合法
成員變量(Members)
向量中的分量值可以使用“x”, “y”, “z” 或者“w”來訪問捡偏,同時也可已使用“r”, “g”, “b” 和“a”來訪問,二者是等效的峡迷。哪一個更加直觀方便就可以使用哪一個霹琼。
對于矩陣(matrices),可以使用m[row][colum]
的形式訪問其每一個元素,或者以m[idx]
的形式使用行索引(row index)訪問一個行向量凉当。例如訪問一個mat4(4x4的矩陣)中的位置y,我們可以這樣做m[3][1]
枣申。
構造(Constructing)
構造向量類型可以按照如下例子傳參數(shù):
// 傳遞所需數(shù)量的分量參數(shù)
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
// 傳遞互補的 向量 及/或 標量
vec4 a = vec4(vec2(0.0, 1.0), vec2(2.0, 3.0));
vec4 a = vec4(vec3(0.0, 1.0, 2.0), 3.0);
// 也可以為整個向量傳一個值
vec4 a = vec4(0.0);
構造矩陣要求向量的維度和矩陣維精度(Precision)度相同,當然你也可以使用matx(float)
的形式構造一個對角矩陣(diagonal matrix),例如mat4(1.0)代表一個4維單位矩陣(identity matrix)
mat2 m2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));
mat3 m3 = mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0));
mat4 identity = mat4(1.0);
矩陣可以由不同維度的矩陣創(chuàng)建看杭,但是要注意兩個原則:
如果用一個小維度矩陣創(chuàng)建一個大維度矩陣忠藤,那么剩余的部分,將由大維度矩陣的單位矩陣相對應值填充
如果用一個大維度矩陣創(chuàng)建一個小維度矩陣楼雹,那么將截取大維度矩陣左上角的子矩陣
mat3 basis = mat3(WORLD_MATRIX);
mat4 m4 = mat4(basis);
mat2 m2 = mat2(m4);
混寫(Swizzling)
(注:Swizzling直譯是旋轉模孩,在此處的意譯取網上的一種翻譯"混寫")
混寫是指可以獲取向量分量任意順序的組合尖阔,只要(組合的)結果依然是向量或者標量,舉個例子更好理解:
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
vec3 b = a.rgb; // 用vec4的分量“混寫”構造一個vec3
vec3 b = a.ggg; // 依然合法; 用vec4的單一分量“混寫”構造一個vec3
vec3 b = a.bgr; // 分量的順序是無關緊要的
vec3 b = a.xyz; // 用xyzw依然等效
float c = b.w; // 非法, 因為作為vec3的b中不包含"w"分量.