本文章仅用于记录学习情况,资料来源LearnOpenGL CN
数据类型
GLSL有向量(Vector)、矩阵(Matrix)两种容器类型,此处先学习向量。
向量
一个向量可以包含2、3或4个分量,分别使用.x、.y、.z和.w来获取第1、2、3、4个分量。
重组
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
例:vec2 vect = vec2(0.5, 0.7);
vec4 result = vec4(vect, 0.0, 0.0); //即:vec4(0.5,0.7,0.0,0.0)
vec4 otherResult = vec4(result.xyz, 1.0); //即:vec4(0.5,0.7,0.0,1.0)
输入(in)、输出(out)
//顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos; //位置变量的属性位置值为0
out vec4 vertexColor; //为片段着色器指定一个颜色输出
void main() {
gl_Position = vec4(aPos, 1.0); //注意我们如何把一个vec3作为vec4的构造器的参数
vertexColor = vec4(0.5, 0.0, 0.0, 1.0); //把输出变量设置为暗红色
}
//片段着色器
#version 330 core
out vec4 FragColor;
in vec4 vertexColor; //从顶点着色器传来的输入变量(名称相同、类型相同)
void main() {
FragColor = vertexColor;
}
Uniform
Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,是全局的。
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor; //在OpenGL程序代码中设定这个变量
void main() {
FragColor = ourColor;
}
......
//渲染循环中
float timeValue = glfwGetTime(); //获取秒数
float greenValue = (sin(timeValue) / 2.0f) + 0.5f; //让颜色在0.0到1.0之间改变并将结果储存在greenValue中
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); //查询uniform ourColor的位置值
glUseProgram(shaderProgram); //激活着色器程序
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); //设置uniform ourColor的值,在此之前需先激活着色器程序
......
更多属性
//顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos; //位置变量的属性位置值为 0
layout (location = 1) in vec3 aColor; //颜色变量的属性位置值为 1
out vec3 ourColor; //向片段着色器输出一个颜色
void main() {
gl_Position = vec4(aPos, 1.0); ourColor = aColor; //将ourColor设置为我们从顶点数据那里得到的输入颜色
}
//片段着色器
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
void main() {
FragColor = vec4(ourColor, 1.0);
}
......
//顶点、颜色数据
float vertices[] = {
//位置 //颜色
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, //右下
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, //左下
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f //顶部
};
......
//位置属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); //步长为6个float,其中3个为位置值,三个为颜色值
glEnableVertexAttribArray(0);
//颜色属性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float))); //偏移量为3个float,前三个float为位置值,后三个float才为颜色值
glEnableVertexAttribArray(1);
......