Godot Shader筆記:著色器語(yǔ)言(二)

原文地址:Docs ? Shading ? Shading reference ? Shading language

類(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è)原則:

  1. 如果用一個(gè)小維度矩陣創(chuàng)建一個(gè)大維度矩陣,那么剩余的部分,將由大維度矩陣的單位矩陣相對(duì)應(yīng)值填充

  2. 如果用一個(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"分量.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容