1.数据类型
1.1 标量
三种基本类型:float int bool,以及由这些数据类型组成的数组和结构体。
GLSL不支持指针,字符,字符串,双精度浮点数,字节,短整型,长整型或这些类型的无符号型。
float f = 3.14;//不需要后缀指明精度
float f1 = 3;//wrong,不支持强制类型转换
float f2 = float(3);//使用构造函数进行转换
int i = 42;
int i1 = 042;//八进制
int i2 = 0x4A;//十六进制
1.2 矢量
向量和矩阵也作为基本数据类型,向量类型包括由上述三种基本数据类型构成的是二维 三维 四维的向量,比如浮点型三维向量为vec3,整形四维向量为ivec4
vec2,vec3,vec4 包含2,3,4个浮点数的矢量
ivec2,ivec3,ivec4 包含2,3,4个整数的矢量
bvec2,bvec3,bvec4 包含2,3,4个布尔数的矢量
可以使用以下的名称来访问矢量的各个元素:
x,y,z,w 将矢量看做一个位置或方向
r,g,b,a 将矢量看做一种颜色
s,t,p,q 将矢量看做一个纹理坐标
vec3 v;
v[1] = 3.0;
v.x = 2;
v.xy = v2.yz;//将v2的头2个元素互换,在复制到v2的头2个元素中
1.3 矩阵
mat2 2*2的浮点数矩阵
mat3 3*3的浮点数矩阵
mat4 4*4的浮点数矩阵
矩阵是列向量优先的,可以将矩阵作为列矢量的数组来访问,如果transform是一个mat4,那么transform[2]就是transform的第三列,transform[3][1]是transform的第四列的第二个分量。第一索引是列,第二索引是行
1.4 取样器
sampler 取样器,封装要访问的纹理的句柄
sampler1D 访问一个一维纹理
sampler2D 访问一个二维纹理
sampler3D 访问一个三维纹理
samplerCube 访问一个立方贴图纹理
sampler1DShadow 访问一个带对比的一维深度纹理
sampler2DShadow 访问一个带对比的二维深度纹理
着色器本身不能初始化取样器,只能通过一个uniform限定的取样器从应用程序接收取样器,或者将他们传递给用户或内置函数
uniform sampler2D Grass;
vec4 color = texture2D(Grass,coord);//coord是一个vec2,存储了要用来作为草地纹理的索引的二维位置,color是执行纹理查找的结果,texture是纹理查找函数
1.5 结构
同C,不需要使用typedef关键字
1.6 数组
声明时不必指定大小,可以在要使用时再指定大小,或直接用下标使用,编译器会使数组足够大以存放数组
vec4 point[];
//1.后指定大小
vec4 point[10];//以后就是10大小,不可在更改大小,不可在重复定义
//2.直接使用
vec2 point[2]=vec4(1.0);//现在大小为3
vec2 point[7]=vec4(2.0);//大小为8
1.7 初始化器和构造函数
所有的内置函数和结构都有构造函数
vec4 v = vec4(1.0,2.0,3.0,4.0);
vec3 v2 = vec3(0.6);//==vec3(0.6,0.6,0.6)全为此值
vec2 v3 = vec2(v);//v的前2个部分将初始化v3
vec2 v4 = vec2(1.0,2.0,3.0);//舍弃第三个分量
mat2 m = mat(2.0);// == mat2(2.0,0.0,0.0,2.0)对角线
1.8 类型转化
类型转换使用构造函数完成
2 限定符:
GLSL中有四个限定符
- const 同C++,标定一个常量
- attribute 仅用于顶点着色器,对于某一顶点来说是不可更改的
- uniform 对于一个图元来说是不可更改的,用于顶点着色器和像素照色器
- varying 用于从顶点着射器向片段着色器传递数据
3 运算符和数学函数
GLSL支持所有标准运算符,且都支持向量和矩阵运算,支持所有C的流程控制语句(if,for,while,do-while),GLSL中应尽量避免使用循环语句
例:
mat4 a,b,c;
c=a*b;//c是矩阵a和b叉乘的结果,不等于b*a
vec3 a,b;
b=sqrt(a);//b中的每个元素都是a的对应元素的平方根
流经着色器
能够实现基本的渲染功能的最小着色器称作流经着色器,含义是数据流在不经处理的情况下流过着色器,这样的着色器结构非常简单。
例:
void main(void)
{
//选择一: gl_Position = gl_ProjectionMatrix*gl_ModelViewMatrix * gl_Vertex;
//选择二:gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
/*选择三:*/gl_Position = ftransform();
}
这里提供了3种作用相同的流经顶点着射器。它们的作用是将该顶点与当前的模型视图矩阵和投影矩阵依次相乘。注意:当前顶点的坐标被保存在变量gl_Position中,这是opengl提供的内建变量
类似的一个流经片段着射器如下:
void main(void)//流经片段着射器
{
gl_FragColor = gl_FrontColor;
}
这个流经片段着射器只保留了当前的模型颜色。gl_FragColor是OpenGL的内建变量表示当前片段颜色