1.GLSL中向量的数据类型

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);
|
效果:

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