glsl 基礎語法


向量(Vector)

在 GLSL 中向量一般用於儲存頂點坐標、顏色或紋理坐標數據。一個向量可以包含 2 到 4 個分量(Component),分量的類型也可以是以上基礎類型中的任意一個,一般情況下我們使用浮點型 vecn 就已經足夠了。

關鍵字

含義

舉例

vecn

包含 n 個 float 類型分量的向量

vec2vec4

ivecn

包含 n 個 int 類型分量的向量

ivec2ivec4

uvecn

包含 n 個 uint 類型分量的向量

uvec2uvec4

bvecn

包含 n 個 bool 類型分量的向量

bvec2bvec4

 

創建向量

我們可以使用不同的構造函數來創建相應的向量:

vec2 coord = vec2(0.5, 0.5); // 含有 2 個 float 類型分量的向量
ivec3 police = ivec3(1, 1, 0); // 含有 3 個 int 類型分量的向量
bvec4 hello = bvec4(true, false, true, false); // 含有 4 個 bool 類型分量的向量

只傳入一個參數的情況下會自動將其他值也設為第一個參數:

vec3 three = vec3(0.1); // 等同於 vec3(0.1, 0.1, 0.1)

也可以使用一個向量作為參數傳給另一個向量構造函數:

vec2 two = vec2(0.1, 0.2);
vec3 three = vec3(two, 0.3); // vec3(0.1, 0.2, 0.3)

而將“大”向量作為參數來創建“小”向量(降維)會自動拋棄多余的值:

vec4 four = vec4(0.1, 0.2, 0.3, 0.4);
vec3 three = vec3(four); // 等同於 vec3(0.1, 0.2, 0.3),拋棄了 0.4

 

 分量

實際上所有向量都可以使用 xyzw、rgbastpq 分量名,但是為了代碼的嚴謹性和可讀性,建議使用相應的分量名

分量名(對應第 1 - 4 個分量)

使用場景

x, y, z, w

頂點坐標向量

r, g, b, a

顏色向量

s, t, p, q

紋理坐標向量

重組

另外,你還可以使用同一組分量名的任意組合來創建一個新的向量:

vec4 coord = vec4(0.1, 0.2, 0.3, 0.4);
vec2 one = coord.xx; // vec2(0.1, 0.1)
vec2 two = coord.xy; // vec2(0.1, 0.2)
vec3 three = coord.xzw; // vec3(0.1, 0.3, 0.4)
vec4 four = coord.wzyx; // vec4(0.4, 0.3, 0.2, 0.1)
vec4 boom = coord.xyzw + coord.wzyx; // vec4(0.5, 0.5, 0.5, 0.5)
vec4 hello = vec4(coord.zyx, 0.0); // vec4(0.3, 0.2, 0.1, 0.0)

 

矩陣(Matrix)

矩陣最多能夠支持 4 列 4 行的數據,且其元素只能夠為 float 類型。

下面表格中的 nm 皆為 2 到 4 的任意數字

 

關鍵字

含義

舉例

matnxn /matn

表示一個 n 列 n 行的浮點型矩陣

mat2mat3mat3x3

matnxm

表示一個 n 列 m 行的浮點型矩陣

mat2x3mat4x3

 

創建矩陣

使用不同的構造函數來創建相應的矩陣:

// 創建一個 2x2 的矩陣
mat2 two = mat2(0.1, 0.2, // 第一列
                 0.3, 0.4); // 第二列
0.1 0.3
0.2 0.4
// 創建一個 3x3 的矩陣
mat3 three = mat3(0.1, 0.2, 0.3, // 第一列
                  0.4, 0.5, 0.6, // 第二列
                  0.7, 0.8, 0.9); // 第三列
0.1 0.4 0.7
0.2 0.5 0.8
0.3 0.6 0.9
 

 

只傳入一個參數的情況下會自動補零:

mat2 two = mat2(1.0); // 等同於 mat2(1.0, 0.0, 0.0, 0.0)
mat3 three = mat2x3(1.0); // 等同於 mat3(1.0, 0.0, 0.0, 0.0, 0.0, 0.0)

我們也可以向構造函數傳入向量來創建矩陣:

vec2 a = vec2(1.0, 0.0);
vec2 b = vec2(0.5, 0.1);
mat2 four = mat2(a, b); // 等同於 mat2(1.0, 0.0, 0.5, 0.1)
// 創建一個 2x3 的矩陣
mat2x3 haha = mat2x3(a, 0.3,
              b, 0.2); // 等同於 mat2x3(1.0, 0.0, 0.3, 0.5, 0.1, 0.2)

降維操作會自動拋棄多余的元素,升維則會自動補零:

// 偽代碼
mat3x3(mat4x4); // 保留參數的前 3 列前 3 行的元素
mat2x3(mat4x2); // 保留參數的前 2 列前 2 行的元素,第 3 行補零
 

獲取元素

可以通過 [] 操作符來獲取矩陣的某個元素(下標從 0 開始):

mat3 three = mat3(0.1, 0.2, 0.3, // 第一列
                  0.4, 0.5, 0.6, // 第二列
                  0.7, 0.8, 0.9); // 第三列
float el = three[0][2]; // 獲取第一列第三行的元素:0.3

也可以通過分量名來獲取元素:

float el = three[0].z; // 同上,獲取第一列第三行的元素:0.3

 

 采樣器(Sampler)

 在 GLSL 中我們需要通過采樣器來獲取紋理的信息。采樣器只能在 Shader 外部的宿主語言中通過 OpenGL 的 API 來進行賦值。

 采樣器的類型較多,這里只列出了常見的幾個

關鍵字

含義

smapler2D

用來訪問 2D 紋理的句柄

sampler3D

用來訪問 3D 紋理的句柄

samplerCube

用來訪問立方體映射紋理的句柄

sampler2DArray

用來訪問 2D 紋理數組的句柄

剩下不常用的還有 samplerCubeShadowsampler2DShadowsampler2DArrayShadowisampler2Disampler3DisamplerCubeisampler2DArrayusampler2Dusampler3DusamplerCubeusampler2DArray

采樣器必須使用 uniform 關鍵字來修飾,內置的 texture 函數獲取顏色:

uniform sampler2D myTexture;
// 通過內置的 texture 函數獲取 myTexture 紋理 uv_0 坐標處的顏色
vec4 color = texture(myTexture, uv_0);

結構體(Structure)

 GLSL 允許你使用 struct 關鍵字來自定義一個新的類型,新的自定義類型可以包含其他已經定義的類型:

// 定義一個名為 circle 的類型,包含一個浮點型成員和一個四維向量成員
struct circle {
    float radius;
    vec4 color;
};
// 創建一個 circle 類型的變量
circle myCircle;
// 單獨給 radius 賦值
myCircle.radius = 0.5;

 

原文鏈接:https://mp.weixin.qq.com/s/mgyjYWiD9NOCHhNFSfoGJg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM