1.GLSL中向量的数据类型

image-20231215145202684

2.Uniform

uniform是一种在顶点着色器和片段着色器之间进行数据传递的机制,uniform变量是全局的,其值在每个渲染迭代中对所有顶点或片段是一致的。

变量声明:

1
uniform vec3 cameraPosition;

使用:

1
2
3
4
5
6
7
8
//返回自窗口初始化以来的秒数
float timeValue = glfwGetTime();
//将timeValue缩放到[0, 1]范围
float greenValue = sin(timeValue) / 2.0f + 0.5f;
//查询uniform ourColor的位置值
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
//设置uniform值
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

3.颜色插值

OpenGL会自动在顶点着色器和片段着色器之间进行插值

定义顶点着色器和片段着色器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
float vertices[] = {
// 位置 // 颜色
0.8f, 0.2f, 0.0f, 1.0f, 0.0f, 0.0f, // 右下
0.3f, 0.4f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下
0.0f, 0.1f, 0.0f, 0.0f, 0.0f, 1.0f, // 顶部
0.2f, 0.9f, 0.0f, 0.8f, 0.6f, 1.0f
};
unsigned int indices[] = {
0,1,2, // 第一个三角形
2,1,3 // 第二个三角形
};
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"layout(location=1) in vec3 aColor;"
"out vec4 vertexColor; \n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
" vertexColor=vec4(aColor.x,aColor.y,aColor.z,1.0f); \n"
"}\0";

const char* fragmentShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"uniform vec4 ourColor; "
"in vec4 vertexColor;\n"
"void main(){\n"
"FragColor = vertexColor;}\n ";

配置顶点属性指针:

1
2
3
4
5
6
// 位置属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 颜色属性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

效果:

image-20231215170557358

注:片段着色器不会直接从 VBO 中读取数据,而是通过与顶点着色器的输出交互,通过插值的方式在片段上进行着色。

4.文件流读取着色器内容