完整版原文地址:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/
https://learnopengl.com/Getting-started/Hello-Triangle
1.三个概念
- 顶点数组对象:Vertex Array Object,VAO
- 顶点缓冲对象:Vertex Buffer Object,VBO
- 索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO
2.在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的
2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。
下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分
实际的obj文件不仅有顶点数组,还包含uv,索引等,从obj到顶点数组需要经过VBO和VAO
一个AVO可以可以持有两种类型的buffer ,GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER
在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)
流水线流程
3.造一个VAO
在适当的位置,如在glViewport之后造一个VAO
unsigned int VAO;
glGenVertexArrays(1, &VAO);//glGenVertexArrays方法可以产生多个VAO,第一个参数代表产生的VAO个数,第二个参数是VAO对象的地址,这个函数返回一个VAO ID填充到变量VAO中
//扩展 由于glGenVertexArays可以返回多个ID当需要产生多个VAO时,如10个,需定义一个数组接受函数返回值
/*
unsigned int VAO[10];
glGenVertexArrays(10,AVO); //数组名就是数组的首地址
*/
4.将造完的VAO绑定到渲染管道
使用glBindVertexArray函数,此函数需要一个ID作为参数
unsigned int VAO;
glGenVertexArrays(1, &VAO);//glGenVertexArrays方法可以产生多个VAO,第一个参数代表产生的VAO个数,第二个参数是VAO对象的地址,这个函数返回一个VAO ID填充到变量VAO中
//扩展 由于glGenVertexArays可以返回多个ID当需要产生多个VAO时,如10个,需定义一个数组接受函数返回值
/*
unsigned int VAO[10];
glGenVertexArrays(10,AVO); //数组名就是数组的首地址
*/
glBindVertexArray(VAO);
5.造一个VBO绑到VAO的造一个VBO绑定到VAO的GL_ARRAY_BUFFER上上
类似VAO,创建VBO使用函数glGenBuffers
//造一个VBO绑定到VAO中的GL_ARRAY_BUFFER上
unsigned int VBO;
glGenBuffers(1, &VBO);//同上
glBindBuffer(GL_ARRAY_BUFFER, VBO);//两个参数,第一个是绑去哪里,第二个是要绑定的VBO的id
6.将顶点塞到VBO中
使用glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
方法,完成数据从CPU到GPU
glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数
四个参数:
第一个参数表示要填充的缓冲类型
第二个参数具体指明了缓冲的数据有多少(单位是字节)
第三个参数是具体要发送的数组
第四个参数指明显卡如何处理刚才发送的数组,他有三种形式:
- GL_STATIC_DRAW :数据不会或几乎不会改变。
- GL_DYNAMIC_DRAW:数据会被改变很多。
- GL_STREAM_DRAW :数据每次绘制时都会改变。
7.到此步骤黑色的部分完成,但是还不能显示,因为还没有写shader(着色器)
8.Vertex shader
暂时将教材中的代码硬编码为一个字符数组
将代码贴到notepad++中,减少行数,不然看起来很乱,然后在每一行后面加\n,按alt键复选行可以全部添加
然后在每一行的开始和结尾都加上"
最后加上;
把这段代码复制到源程序的顶部 赋值给一个变量 const char* vertexShader
//顶点着色器
const char* vertexShaderSource =
"#version 330 core