概述
GLSL是专门为徒刑开发设计的编程语言(OpenGL着色器语言)。
常用名词解释
1、图元
用来组成图像的最基本元素,所有的图像都由且仅由图元组成。图元包含 点、 线段、 三角形。
2、OpenGL渲染管线
显示芯片内部处理图形信号互相独立的并行处理单元,即一系列有序的处理阶段的序列,用于把应用汇总的中的数据转
化到OpenGL中中生成一个最终的图像的一个过程。
3、可编程管线的编程阶段
4、最基本语法
a、注释
单行:"//"
多行:"/*.........*/"
b、main函数没有返回值
c、每条语句的结尾必须带分号
变量初识
1、基本数据类型
类型 | 描述 |
float | IEEE 32位浮点数(float必须包含小数点) |
int | 有符号32位整数 |
uint | 无符号32位整数 |
bool | 布尔值 |
2、变量命名规范
a、变量名由数字字母下划线组成,首字符只能是字母。
b、变量名中不能包含连续下划线。
c、系统内建变量都是以"gl"开头,不允许自定义以"gl"开头的变量名、类型、常量名、函数名。
d、见名知意。
向量
1、向量在着色器中的作用
向量可以很方便的存储以及操作颜色、位置、纹理等不仅包含一个组成部分的量。
2、向量的操作
基本语法为"<向量名>.<分量名>"。
基本类型
|
2D向量
|
3D向量
|
4D向量
|
float
|
vec2
|
vec3
|
vec4
|
int
|
ivec2
|
ivec3
|
ivec4
|
bool
|
bvec2
|
bvec3
|
bvec4
|
a、初始化
vec3 xyz = vec3(0.0, 0.1, 0.2);
vec4 rgba = vec4(0.0, 0.1, 0.2, 0.3);
vec3 xyz = vec3(0.1); 等价于 vec3 xyz = vec3(0.1, 0.1, 0.1);
b、加长
vec3 xyz = vec3(0.0, 0.1, 0.2);
vec4 rgba = vec4(xyz, 0.3);
c、取短
vec4 rgba= vec4(0.0, 0.1, 0.2, 0.3);
vec3 xyz= rgba.rgb;
d、元素操作
vec4 rgba= vec4(0.0, 0.1, 0.2, 0.3);
float r = rgba.r;
3、分量
分量是聚合类型(向量、矩阵)中的一个元素
分量访问符
|
符号描述
|
(r, g, b, a)
|
颜色数据
|
(x, y, z, w)
|
位置坐标
|
(s, t, p, q)
|
纹理坐标
|
rgba : 红,绿,蓝,透明度;
xyzw : 空间坐标,齐次坐标(把n维的向量,运用n + 1维来表示,一般填1)
stpq : 纹理还没学,留个坑,以后补,标红提示我自己;
矩阵
1、矩阵在3D开发中的作用
位移变换
2、矩阵的操作
基本类型
|
2阶矩阵
|
3阶矩阵
|
4阶矩阵
|
float
|
mat2
|
mat3
|
mat4
|
a、初始化
初始化顺序为先填充列,再填充行。
mat3 m = mat3(1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0);
等同于
vec3 col0 = vec3(1.0, 4.0, 7.0);
vec3 col1 = vec3(2.0, 5.0, 8.0);
vec3 col2 = vec3(3.0, 6.0, 9.0);
mat3 m = mat3(col0, col1, col2);
b、元素操作
mat3 m = mat3(1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0);
float f = m[2][1]; //取第2列第1行的数2.0
float f = m[2].x; //结果同上
vec3 xyz = m[1]; //取第1列向量。
结构体和采样器
1、结构体
与C语言中结构体相同
2、采样器
采样器类型
|
说明
|
sampler2D
|
用来访问二维贴图
|
sampler3D
|
同来访问三维贴图
|
samplerCube
|
用来访问立体贴图
|
数组
数组的索引是从0开始,注意和矩阵的操作区分开,矩阵的操作写法和二维数组类似,记住,矩阵不是数组,操作是先列后行,索引从1开始。
类型修饰符
1、attribute
一般用于修饰每隔顶点都各不相同的数据,例如:颜色,顶点等。
a、只用于顶点着色器中
b、是属性限定符
c、只能修饰以浮点数为基本类型的数据类型(向量,矩阵等);
2、uniform
一致变量限定符
一直变量:对同一组顶点组成的单个3D物体中所有的顶点都相同的量。
a、主要用于顶点和片元着色器中
b、可以修饰所有数据类型(对应attribute的只能修饰浮点型)
3、varying
用来传递顶点着色器中的数据到片元着色器中
注:顶点着色器中和片元着色器中变量名和定义必须一模一样。
例:
顶点着色器:varying vec2 texture;
片元着色器:varying vec2 texture;
4、const
常量
5、in和out
in:修饰输入变量
out:修饰输出变量
6、inout
修饰的变量既可以输入也可以输出。
语句
1、控制流
if()else{}
switch()
2、循环语句
for、while
3、流控制语句
break、return、continue、discard
discard:丢弃当前片元,终止片元着色器执行。只出现在片元着色器中。
4、函数定义
函数要定义在main函数之前。函数定义时,必须加访问修饰符。
访问修饰符:private、protected、public
内建变量
1、输入变量
负责将着色器管线中固定的部分产生的信息传递进着色器。
片元输入:gl_FragCoord、gl_FrontFacing
gl_FragCoord:窗口信息
gl_FrontFacing:布尔值,判断片元处于光栅化阶段时生产此片元的正面(true)或反面(false)。
2、输出变量
负责将着色器产生的信息传递给渲染管线中的固定功能
顶点输出:gl_Position,gl_Pointsize
gl_Position:接收顶点数据
gl_Pointsize:计算点大小、单位像素
片元输出:gl_FragColor,gl_FragData
gl_FragColor:上色
gl_FragData:渲染管线后续操作