要点:
- 着色器之间靠数据传输,也就是数据输入----输出交流
- 交流时,主要使用的关键字 in out
- 但是顶点着色器和片段着色器的输入输出有些不同,因为顶点着色器需要高效率的输入顶点数据,因此使用location和layout的组合以表示数据输入
- 片段着色器因为最终要输出一个颜色到屏幕,因此需要一个vec4作为容器输入颜色
核心代码段:
const char *vertexbuffersource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n" // 位置变量的属性位置值为0
"out vec4 vertexColor;\n" // 为片段着色器指定一个颜色输出
"void main()\n"
"{\n"
"gl_Position = vec4(aPos, 1.0);\n"// 注意我们如何把一个vec3作为vec4的构造器的参数
"vertexColor = vec4(0.5, 0.0, 0.0, 1.0);\n" // 把输出变量设置为暗红色
"}\n\0";
const char *fragmentbuffersource = "#version 330 core\n"
"out vec4 FragColor;\n"
"in vec4 vertexColor;\n" // 从顶点着色器传来的输入变量(名称相同、类型相同)
"void main()\n"
"{\n"
"FragColor = vertexColor;\n"
"}\n\0";
全部代码段:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
const unsigned int screen_width = 800;
const unsigned int screen_height = 600;
void framebuffer_size_callback(GLFWwindow * window, int width, int height);
void inputProcess(GLFWwindow * window);
const char *vertexbuffersource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n" // 位置变量的属性位置值为0