1. 管线图例
2. 进入 main() 函数
1 | //---------------------------------------------------------------------------- |
3. OpenGL 的初始化过程
3.1 对象结构
VAO : {VBO , 顶点属性}
注意绑定顺序 :
- 生成和绑定 VAO ;
- 生成和绑定 VBO ;
- 将 VBO 和 顶点数据 关联;
- 设置 顶点属性 { 数组头指针 , 数据步长 } ;
- 这时 VAO 才同时存储 VBO 和 顶点属性 两个信息
3.2 变量声明
1 | enum VAO_IDs { Triangles, NumVAOs }; |
3.3 顶点数组
3.3.1 顶点数组对象(VAO)
1 | //---------------------------------------------------------------------------- |
3.3.2 顶点缓存对象(VBO)
1 | //---------------------------------------------------------------------------- |
3.3.3 索引缓冲对象
当需要绘制两个三角形时:
1 | float vertices[] = { |
其中有重复的顶点信息,这时可以维护一个索引数据
- 顶点数据 :存储顶点的原始信息(位置、颜色等);
- 索引数据 :指定三角形每个顶点所需要的顶点数据的索引。
1 | float vertices[] = { |
使用流程同上:
1 | // 生成 |
渲染:
1 | // 绑定 |
3.4 初始化顶点与片元着色器
3.4.1 顶点着色器
1 | // 版本声明,450 表示使用的 OpenGL 4.5 |
该处为一个 传递着色器 ,只负责将输入数据拷贝到输出数据中
3.4.2 片元着色器
1 |
|
依据位置信息,生成对应的颜色信息
vPosition
-> gl_Position
-> fColor
Note :
- 所有的输入输出变量都应设置
location
3.4.3 初始化着色器
1 | //---------------------------------------------------------------------------- |
Note :
- 关于
Shader.class
:
《LoadShaders_加载着色器》
4. 读取着色器的基本流程
4.1 着色器对象
4.1.1 创建着色器对象
- 创建着色器对象,例如
GL_VERTEX_SHADER
、GL_FRAGMENT_SHADER
1 | GLuint vertexShader; |
4.1.2 关联着色器数据
- 将着色器对象和着色器数据关联
1 | // 着色器数据 |
4.1.3 编译着色器
- 编译着色器
1 | glCompileShader(fragmentShader); |
4.1.4 生成报错日志
- 检测编译是否成功,生成日志
1 | GLint success; |
4.1.5 维护一个着色器数组
上述是以顶点着色器为例,片元着色器同理,在实际使用过程中,会有多个着色器,这时我们可以维护一个着色器的数组,迭代的进行上述流程
1 | ShaderInfo shaders[] = |
4.2 着色器程序
4.2.1 创建着色器程序对象
1 | GLuint shaderProgram; |
4.2.2 添加着色器对象
将 4.1 中编译完成的 着色器对象 依次添加到 着色器程序对象 上
1 | glAttachShader(shaderProgram, vertexShader); |
4.2.3 着色器链接
进行着色器的链接操作
1 | glLinkProgram(shaderProgram); |
4.2.4 生成报错日志
检测着色器链接是否成功
1 | glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); |
4.2.5 激活着色器程序
着色器程序激活之后,在渲染过程中会自动使用该着色器管线进行渲染
1 | glUseProgram(shaderProgram); |
4.2.6 释放着色器对象
1 | glDeleteShader(vertexShader); |
5. 使用 OpenGL 进行渲染
1 | //---------------------------------------------------------------------------- |