類(lèi)型轉(zhuǎn)換(Casting)
和GLSL ES 3.0一樣,無(wú)論是標(biāo)量(Scalar)還是向量(Vector),即使維度(size)相同,但如果類(lèi)型不同,也是無(wú)法進(jìn)行隱式(implicit)類(lèi)型轉(zhuǎn)換。如果連維度都不同,則更加不能夠隱式轉(zhuǎn)換。所有的類(lèi)型轉(zhuǎn)換必須是顯式(explicit)的且基于構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)。
例子
float a = 2; // 非法
float a = 2.0; // 合法
float a = float(2); // 合法
默認(rèn)的整型是有符號(hào)的,因此要賦值給無(wú)符號(hào)整型也需要進(jìn)行類(lèi)型轉(zhuǎn)換
int a = 2; // 合法
uint a = 2; // 非法
uint a = uint(2); // 合法
成員變量(Members)
向量中的分量值可以使用“x”, “y”, “z” 或者“w”來(lái)訪(fǎng)問(wèn),同時(shí)也可已使用“r”, “g”, “b” 和“a”來(lái)訪(fǎng)問(wèn),二者是等效的。哪一個(gè)更加直觀方便就可以使用哪一個(gè)。
對(duì)于矩陣(matrices),可以使用m[row][colum]的形式訪(fǎng)問(wèn)其每一個(gè)元素,或者以m[idx]的形式使用行索引(row index)訪(fǎng)問(wèn)一個(gè)行向量。例如訪(fǎng)問(wèn)一個(gè)mat4(4x4的矩陣)中的位置y,我們可以這樣做m[3][1]。
構(gòu)造(Constructing)
構(gòu)造向量類(lèi)型可以按照如下例子傳參數(shù):
// 傳遞所需數(shù)量的分量參數(shù)
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
// 傳遞互補(bǔ)的 向量 及/或 標(biāo)量
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);
// 也可以為整個(gè)向量傳一個(gè)值
vec4 a = vec4(0.0);
構(gòu)造矩陣要求向量的維度和矩陣維精度(Precision)度相同,當(dāng)然你也可以使用matx(float)的形式構(gòu)造一個(gè)對(duì)角矩陣(diagonal matrix),例如mat4(1.0)代表一個(gè)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)建,但是要注意兩個(gè)原則:
如果用一個(gè)小維度矩陣創(chuàng)建一個(gè)大維度矩陣,那么剩余的部分,將由大維度矩陣的單位矩陣相對(duì)應(yīng)值填充
如果用一個(gè)大維度矩陣創(chuàng)建一個(gè)小維度矩陣,那么將截取大維度矩陣左上角的子矩陣
mat3 basis = mat3(WORLD_MATRIX);
mat4 m4 = mat4(basis);
mat2 m2 = mat2(m4);
混寫(xiě)(Swizzling)
(注:Swizzling直譯是旋轉(zhuǎn),在此處的意譯取網(wǎng)上的一種翻譯"混寫(xiě)")
混寫(xiě)是指可以獲取向量分量任意順序的組合,只要(組合的)結(jié)果依然是向量或者標(biāo)量,舉個(gè)例子更好理解:
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
vec3 b = a.rgb; // 用vec4的分量“混寫(xiě)”構(gòu)造一個(gè)vec3
vec3 b = a.ggg; // 依然合法; 用vec4的單一分量“混寫(xiě)”構(gòu)造一個(gè)vec3
vec3 b = a.bgr; // 分量的順序是無(wú)關(guān)緊要的
vec3 b = a.xyz; // 用xyzw依然等效
float c = b.w; // 非法, 因?yàn)樽鳛関ec3的b中不包含"w"分量.