赞
踩
前面讲解了glsl语言的基础,这里在继续学习一下opengl es经常用到的知识点,如下:
opengl es之-基础概念(一)
opengl es之-GLSL语言(二)
opengl es之-GLSL语言(三)
opengl es之-常用函数介绍(四)
opengl es之-渲染两张图片(五)
opengl es之-在图片上添加对角线(六)
opengl es之-离屏渲染简介(七)
opengl es之-CVOpenGLESTextureCache介绍(八)
opengl es之-播放YUV文件(九)
1、变量类型
变量种类 | 变量类型 | 描述 |
---|---|---|
空 | void | 用于无返回值的函数或者参数为空的函数 |
标量 | float, int, bool | 浮点型,整型,布尔型的标量数据类型 |
浮点型向量 | vec2, vec3, vec4 | 包含2,3,4个元素的浮点型向量 |
整数型向量 | ivec2, ivec3, ivec4 | 包含2,3,4个元素的整型向量 |
布尔型向量 | bvec2, bvec3, bvec4 | 包含1,2,3,4个元素的布尔型 |
矩阵 | mat2, mat3, mat4 | 尺寸为2x2,3x3,4x4的浮点型矩阵 |
纹理句柄 | sampler2D, samplerCube | 分别表示操作2D和cube的句柄 |
备注:GLSL中没有指针类型,大小写敏感的
对于变量类型,GLSL有着非常严格的规则,进行赋值,加减乘除运算必须类型一直,否则会出现语法错误。如果不一致则必须进行强制类型转换
- float myFloat = 1.0;
- bool myBool = true;
- float result = myFloat + myBool(myBool);
2、Structures 结构体
GLSL支持结构体,把一些系统定义的类型聚到一起,组成自定义的类型,也可以包括事先声明的结构体,但是不能定义嵌套结构体。例如:
- struct myStruct
- {
- float f1;
- bool f2;
- vec3 v3;
- }
- // 声明结构体变量
- myStruct lightVar2;
- struct myStruct2
- {
- float f1;
- myStruct st1; //合法
- struct str2{ // 不合法
- bool b1;
- float f2;
- }
- }

3、Arrays 数组
GLSL中的数组和C的数组很类似,支持最基本类型,也支持结构体的数组。例如:
- float frequencies[3];
- uniform vec4 lightPosition[4];
- const int numLights = 2;
- light lights[numLights];
- //备注 GLSL的数组无法在声明的时候初始化。
4、存储限定符
const 常量,或者是函数的只读参数
attribute 只能在顶点着色器中定义,只读属性,由应用程序赋值初始化
uniform 只能定义为全局变量,只读属性,可以由应用程序和opengl 初始化
varying 提供顶点着色器和片段着色器的连接点,只能是float, vec2, vec3, vec4, mat2, mat3, and mat4类型的变量
5、vector变量操作方式
向量的元素有固定的名字去访问,分别有三组{x,y,z,w}、{r,g,b,a}、{s,t,p,q},访问时下表对应长度不能超过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、常用内置函数
备注:如下函数的参数如果不做特殊说明 适用于所有数据类型
mix()函数:
功能:像素混合
定义:mix(x,y,a)
公式:x ∗ (1 – a) + y ∗ a
dot()函数:
功能:计算两个元素的乘积
定义:dot(x,y)
公式:x[0] * y[0] + x[1] * y[1] + .......
atan()函数:
功能:求反正切值
定义:atan (y, x)或者atan (y/x)
区别:atan (y, x)与atan (y/x)的区别,前者的返回值范围是[-π,π],表示点(x,y)和原点与x轴的夹角;后者为[-π/2,π/2],表示根据数字求出正切角度
sqrt()函数:
功能:求平方根
定义:sqrt(x,y)
公式:
sin()函数:
功能:求角度的正弦值
定义:sin(x)
cos()函数:
功能:求角度的余弦值
定义:cos(x)
clamp()函数:
功能:给定一个范围[minval,maxval],如果x在这个范围内,则返回x,否则返回接近边界的minval或者maxval
定义:clamp(x,minVal,maxVal),参数类型为整数和浮点数
公式:等价于min (max (x, minVal), maxVal)
mod()函数
功能:求两个数相除的余数
定义:mod(x,y),这里x和y可以是普通的数也可以是矩阵
公式:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。