一、着色器语言GLSL
由类C语言写成。
着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数,main函数是每个着色器的入口。简单的结构如下:
#version version_number
in type in_variable_name;
in type in_variable_name;
out type out_variable_name;
uniform type uniform_name;
int main()
{
// 处理输入并进行一些图形操作
...
// 输出处理过的结果到输出变量
out_variable_name = weird_stuff_we_processed;
}
对于顶点着色器,其输入变量也被称为顶点属性。
1、数据类型
它保留了C语言的基础类型,如int、double等,同时也扩展了两个容器类型:向量(Vector)和矩阵(Matrix)。
1.1、向量
是一个包含1、2、3或者4个分量的容器,这四个分量分别为:x、y、z、w,其格式为:
其中向量类型为b、i、d、u,n可以取1、2、3和4中的一个。具体解释见下表:向量容器类型+vec+n
image.png
可以通过点语法获取相应的分量,如vec2 someVec;someVec.x。但是不允许访问和获取不存在的分量。
1.2、输入与输出
输入与输出的定义解决了着色器之间的交流问题。使用in和out关键字来定义期输入与输出,两个着色器之间的数据交流,除了in和out关键字外,最重要的是着色器之间交流的变量的类型和变量名要相同,只有类型和变量名想同乐才可以交流。
1.3、Uniform
是一种从CPU数据向GPU着色器发送数据的方式。和顶点属性的区别为:
1、Uniform是全局的
2、其全局性保证了其独一无二
3、其全局性保证了在任意着色器阶段都可以访问
4、无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新