GLSL語言O(shè)penGLES(三)

前言

前面講解了glsl語言的基礎(chǔ),這里在繼續(xù)學(xué)習(xí)一下opengl es經(jīng)常用到的知識點(diǎn),如下:

opengl es系列文章

opengl es之-基礎(chǔ)概念(一)
opengl es之-GLSL語言(二)
opengl es之-GLSL語言(三)
opengl es之-常用函數(shù)介紹(四)
opengl es之-渲染兩張圖片(五)
opengl es之-在圖片上添加對角線(六)
opengl es之-離屏渲染簡介(七)
opengl es之-CVOpenGLESTextureCache介紹(八)
opengl es之-播放YUV文件(九)
1、變量類型

變量種類 變量類型 描述
void 用于無返回值的函數(shù)或者參數(shù)為空的函數(shù)
標(biāo)量 float, int, bool 浮點(diǎn)型,整型,布爾型的標(biāo)量數(shù)據(jù)類型
浮點(diǎn)型向量 vec2, vec3, vec4 包含2,3,4個元素的浮點(diǎn)型向量
整數(shù)型向量 ivec2, ivec3, ivec4 包含2,3,4個元素的整型向量
布爾型向量 bvec2, bvec3, bvec4 包含1,2,3,4個元素的布爾型
矩陣 mat2, mat3, mat4 尺寸為2x2,3x3,4x4的浮點(diǎn)型矩陣
紋理句柄 sampler2D, samplerCube 分別表示操作2D和cube的句柄

備注:GLSL中沒有指針類型,大小寫敏感的
對于變量類型,GLSL有著非常嚴(yán)格的規(guī)則,進(jìn)行賦值,加減乘除運(yùn)算必須類型一直,否則會出現(xiàn)語法錯誤。如果不一致則必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換

float myFloat = 1.0;
bool myBool = true;
float result = myFloat + myBool(myBool);

2、Structures 結(jié)構(gòu)體
GLSL支持結(jié)構(gòu)體,把一些系統(tǒng)定義的類型聚到一起,組成自定義的類型,也可以包括事先聲明的結(jié)構(gòu)體,但是不能定義嵌套結(jié)構(gòu)體。例如:

struct myStruct
{
    float f1;
    bool f2;
    vec3 v3;
}
// 聲明結(jié)構(gòu)體變量
myStruct lightVar2;
struct myStruct2
{
    float f1;
    myStruct st1;   //合法
    struct str2{        // 不合法
        bool b1;
        float f2;
    }
}

3、Arrays 數(shù)組
GLSL中的數(shù)組和C的數(shù)組很類似,支持最基本類型,也支持結(jié)構(gòu)體的數(shù)組。例如:

float frequencies[3];
uniform vec4 lightPosition[4];
const int numLights = 2;
light lights[numLights];
//備注 GLSL的數(shù)組無法在聲明的時候初始化。

4、存儲限定符

const 常量,或者是函數(shù)的只讀參數(shù)
attribute 只能在頂點(diǎn)著色器中定義,只讀屬性,由應(yīng)用程序賦值初始化
uniform 只能定義為全局變量,只讀屬性,可以由應(yīng)用程序和opengl 初始化
varying 提供頂點(diǎn)著色器和片段著色器的連接點(diǎn),只能是float, vec2, vec3, vec4, mat2, mat3, and mat4類型的變量

5、vector變量操作方式
向量的元素有固定的名字去訪問,分別有三組{x,y,z,w}、{r,g,b,a}、{s,t,p,q},訪問時下表對應(yīng)長度不能超過l向量的長度

vec2 v = vec2(3.0);
v.x //正確
v.z // 錯誤
// 向量的元素可以放在一起
vec4 v = vec4(1,2,3,4);
v.zy    // 等于 vec2(3,2)
vec3 v3 = v.xyz // 等于vec3(1,2,3)
v.rgba  // 此種方式不正確,下表同時只能使用一個集合中的名稱
v.yx = vec2(3,0)    // 將y和x的位置互換并給他們的賦值為新的值,將變成 vec4(3,0,3,4);

6、矩陣元素的操作方式

// 用[]訪問元素
mat4 m;
m[1] = vec4(2.0);   // sets the 4th element of the third column to 2.0
m[0][0] = 1.0;  // sets the upper left element to 1.0
m[2][3] = 2.0;  // sets the second column to all 2.0

7、向量和矩陣的操作

vec3 v, u; float f;
v = u + f;
等價于
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;

vec3 v, u, w;
w = v + u;
等價于
w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;

vec3 v, u;
mat3 m;
u = v * m;
等價于
u.x = dot(v, m[0]);
u.y = dot(v, m[1]);
u.z = dot(v, m[2]);

u = m * v;
等價于
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z; u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z; u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;

mat m, n, r;
r = m * n;
等價于
r[0].x = m[0].x * n[0].x + m[1].x * n[0].y + m[2].x * n[0].z;
r[1].x = m[0].x * n[1].x + m[1].x * n[0].y + m[2].y * n[0].z;
r[2].x = m[0].x * n[2].x + m[1].x * n[0].y + m[2].z * n[0].z;
r[0].y = m[0].y * n[0].x + m[1].y * n[1].y + m[2].x * n[1].z;
r[1].y = m[0].y * n[1].x + m[1].y * n[1].y + m[2].y * n[1].z;
r[2].y = m[0].y * n[2].x + m[1].y * n[1].y + m[2].z * n[1].z;
r[0].z = m[0].z * n[0].x + m[1].z * n[2].y + m[2].x * n[2].z;
r[1].z = m[0].z * n[1].x + m[1].z * n[2].y + m[2].y * n[2].z;
r[2].z = m[0].z * n[2].x + m[1].z * n[2].y + m[2].z * n[2].z;

8、常用內(nèi)置函數(shù)

備注:如下函數(shù)的參數(shù)如果不做特殊說明 適用于所有數(shù)據(jù)類型

  • mix()函數(shù):
    功能:像素混合
    定義:mix(x,y,a)
    公式:x ? (1 – a) + y ? a

  • dot()函數(shù):
    功能:計算兩個元素的乘積
    定義:dot(x,y)
    公式:x[0] * y[0] + x[1] * y[1] + .......

  • atan()函數(shù):
    功能:求反正切值
    定義:atan (y, x)或者atan (y/x)
    區(qū)別:atan (y, x)與atan (y/x)的區(qū)別,前者的返回值范圍是[-π,π],表示點(diǎn)(x,y)和原點(diǎn)與x軸的夾角;后者為[-π/2,π/2],表示根據(jù)數(shù)字求出正切角度

  • sqrt()函數(shù):
    功能:求平方根
    定義:sqrt(x,y)
    公式:

  • sin()函數(shù):
    功能:求角度的正弦值
    定義:sin(x)

  • cos()函數(shù):
    功能:求角度的余弦值
    定義:cos(x)

  • clamp()函數(shù):
    功能:給定一個范圍[minval,maxval],如果x在這個范圍內(nèi),則返回x,否則返回接近邊界的minval或者maxval
    定義:clamp(x,minVal,maxVal),參數(shù)類型為整數(shù)和浮點(diǎn)數(shù)
    公式:等價于min (max (x, minVal), maxVal)

  • mod()函數(shù)
    功能:求兩個數(shù)相除的余數(shù)
    定義:mod(x,y),這里x和y可以是普通的數(shù)也可以是矩陣
    公式:

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

相關(guān)閱讀更多精彩內(nèi)容

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