OpenGL教程:4. 手写一个Shader类
在前面的教程中,我们的着色器都是以const char的数组形式来传递的。但是这有个很严重的问题,非常不方面着色器的编写!后期的学习中,我们大部份都需要编写很多着色器的代码,如果在这种环境下编写会非常不方便的。所以,我们可以在另外一个文本中编写着色器,然后用C++的输入流来读取这个文本(这个文本的格式可以是txt,也可以是其他任何格式,但为了方便管理,推荐使用glsl格式或者vsh和fsh格式)。看来写一个Shader读取编译器势在必行。
并且,为了方便管理,我们最好写一个Shader类,专门管理着色器。
定义Shader类
1 | class Shader{ |
Shader类的构造函数:利用C++输入文件流读取着色器并编译之
C++的输入文件流位于ifstream头文件中,所以要使用他,先使用头文件:
1 |
定义构造函数:
1 | Shader::Shader(const std::string &vertexShaderPath, const std::string &fragmentShaderPath) { |
先定义两个着色器的代码字符串以及其路径变量:
1 | // 读取文件 |
接下来读取两个着色器的代码(用try…catch环绕读取主体):
1 | vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); |
这个时候vertexCode和fragmentCode就有内容了,但是glad不认string,所以要转成char*。
1 | //方便起见,就另外建立两个变量char* |
接下来就是简单的编译着色器并链接啦:
1 | // 编译着色器 |
Shader类的析构函数:回收内存
函数内容非常简答,就是删除着色器程序而已:
1 | Shader::~Shader() { |
Shader类的Uniform变量设置函数
这里不多解释啦,非常简单
1 | void Shader::setBool(const std::string &name, bool value) const { |
Shader类的use函数
在使用着色器的时候,直接用use函数来代替glUseProgram函数啦:
1 | void Shader::use() const { |
这样我们的Shader类就写好了!
使用Shader类
我们利用Shader类,再次绘制一个三角形吧!代码不多解释了:
1 | // |
OpenGL教程:4. 手写一个Shader类
http://blog.inverseda.top/2022/11/03/ComputerGraphics/OpenGL/4.手写一个Shader读取编译器/