编写、编译、管理着色器是件麻烦事。写一个类可以从硬盘读取着色器,然后编译并链接它们,并对它们进行错误检测
读取、编译链接着色器(和全流程一样)——Shader(const char vertexPath, const char fragmentPath)
读取文件
编译并链接着色器
类:glShaderSource(vertex, 1, &vShaderCode, NULL);
从硬件读取着色器程序文件的地址
全流程:glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
常量指针
/ 2. 编译着色器
unsigned int vertex, fragment;
// 顶点着色器
vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vShaderCode, NULL);
glCompileShader(vertex);
checkCompileErrors(vertex, "VERTEX");
// fragment Shader
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, NULL);
glCompileShader(fragment);
checkCompileErrors(fragment, "FRAGMENT");
// 着色器程序
ID = glCreateProgram();
glAttachShader(ID, vertex);
glAttachShader(ID, fragment);
glLinkProgram(ID);
checkCompileErrors(ID, "PROGRAM");
// 删除着色器,它们已经链接到我们的程序中了,已经不再需要了
glDeleteShader(vertex);
glDeleteShader(fragment)
使用、定义的方法——use()、setBool(const std::string &name, bool value) const
激活程序——void use() 、 glUseProgram
uniform的setter函数,定义U属性——void setBool(const std::string &name, bool value) const——glUniform1i(glGetUniformLocation())
真正调用——三个函数方法(构造、激活、定义)
由于source来源于硬件上的着色器程序,所以需要传入程序地址再接着一系列的构造