编写、编译、管理着色器是件麻烦事。写一个类可以从硬盘读取着色器,然后编译并链接它们,并对它们进行错误检测

读取、编译链接着色器(和全流程一样)——Shader(const char vertexPath, const char fragmentPath)

读取文件

image.png

编译并链接着色器

  1. 类:glShaderSource(vertex, 1, &vShaderCode, NULL);
  2. 从硬件读取着色器程序文件的地址
  3. 全流程:glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  4. 常量指针
  1. / 2. 编译着色器
  2. unsigned int vertex, fragment;
  3. // 顶点着色器
  4. vertex = glCreateShader(GL_VERTEX_SHADER);
  5. glShaderSource(vertex, 1, &vShaderCode, NULL);
  6. glCompileShader(vertex);
  7. checkCompileErrors(vertex, "VERTEX");
  8. // fragment Shader
  9. fragment = glCreateShader(GL_FRAGMENT_SHADER);
  10. glShaderSource(fragment, 1, &fShaderCode, NULL);
  11. glCompileShader(fragment);
  12. checkCompileErrors(fragment, "FRAGMENT");
  13. // 着色器程序
  14. ID = glCreateProgram();
  15. glAttachShader(ID, vertex);
  16. glAttachShader(ID, fragment);
  17. glLinkProgram(ID);
  18. checkCompileErrors(ID, "PROGRAM");
  19. // 删除着色器,它们已经链接到我们的程序中了,已经不再需要了
  20. glDeleteShader(vertex);
  21. glDeleteShader(fragment)

使用、定义的方法——use()、setBool(const std::string &name, bool value) const

激活程序——void use() 、 glUseProgram

image.pngimage.png

uniform的setter函数,定义U属性——void setBool(const std::string &name, bool value) const——glUniform1i(glGetUniformLocation())

image.png

真正调用——三个函数方法(构造、激活、定义)

由于source来源于硬件上的着色器程序,所以需要传入程序地址再接着一系列的构造

image.png