GLSL
着色器使用GLSL语言写的。
着色器以声明版本号开头,然后是输入、输出变量,uniform变量和main函数。
每个着色器都是以main函数为入口。
数据类型
int float double bool uint
向量vec和矩阵Matrix
向量也有很多种,
vecn 包含n个float分量的默认向量
bvecn 包含n个bool分量的向量
ivecn 包含n个int分量的向量
uvecn 包含n个unsigned int分量的向量
dvecn 包含n个double分量的向量
向量重组
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
输入与输出
每个着色器都有输入和输出,这样才能进行数据交流和传递。GLSL定义了in和out关键字专门来实现这个目的。
顶点着色器应该接收的是一种特殊形式的输入,否则就会效率低下。顶点着色器的输入特殊在,它从顶点数据中直接接收输入。
为了定义顶点数据该如何管理,我们使用location这一元数据指定输入变量,这样我们才可以在CPU上配置顶点属性。我们已经在前面的教程看过这个了,layout (location = 0)。顶点着色器需要为它的输入提供一个额外的layout标识,这样我们才能把它链接到顶点数据。
你也可以忽略layout (location = 0)标识符,通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location),但是我更喜欢在着色器中设置它们,这样会更容易理解而且节省你(和OpenGL)的工作量。
Uniform
Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式。
uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
在程序中更改unifom值
//查找uniform变量的位置
GLint colorLocation = glGetUniformLocation(mProgram, "ourColor");
//更新该uniform变量的值
glUniform4f(colorLocation, 0, green, 0, 1);
网友评论