先推荐几篇好的博文:
https://niyaoyao.github.io/2018/05/23/learning_opengl(es)_opengl_model_pipeline_and_practices/
https://blog.csdn.net/lance710825/article/details/78137950/
https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/04%20Hello%20Triangle/
这里不详细描述渲染管线的流程,大致写一下: 一堆顶点数据(OpenGL的坐标系),经过系列的变换,最终被GPU输出到FrameBuffer额过程.
一些基础的术语名词理解(个人理解;
这些顶点数据被放在一个数组中; 顶点数据一般是这个顶点的坐标(x,y,z);
顶点属性: 包含了一个顶点数据(顶点坐标)及其他属性, 如: 颜色(RGB),法向量(Normal),纹理坐标(Texture Coordinate)等属性
"顶点属性"意味着GPU中的shader程序每调用一次,顶点缓冲区都会为其提供一个新的顶点数据.
上图是一个包含了颜色的顶点属性
//接下来用顶点属性表示要被处理的数据; 可以认为顶点属性就是顶点数据
顶点缓冲区: 这些顶点属性都是要被复制到GPU中的内存(显存)中.
这个内存就被顶点缓冲对象(Vertex Vuffer Object, VBO)管理,我们可以认为VBO 就是一块内存区域,里面存储了一堆顶点属性;
//GLuint 无符号四字节整型,包含数值从0 到 4,294,967,295
GLuint VBO;
//生成一个VBO对象,
glGenBuffers(1, &VBO);
glGenBuffers()
意思是该函数用来生成缓冲区对象的名称。
函数原型:void glGenBuffers(GLsizei n,GLuint * buffers);
glGenBuffers()函数 仅仅是生成一个缓冲对象的名称,类似c语言中的一个指针变量,仅仅是个缓冲对象,还不是一个顶点数组缓存.
因为这时候根本没有进行内存分配, 可以理解只是声明了一个变量, 我们准备用这个变量来引用准备分配的内存.
GLuint vbo;
glGenBuffers(1,&vbo);
GLuint vbo[3];
glGenBuffers(3,vbo);
个人理解如下,可以声明一个GLuint变量,然后使用glGenBuffers后,它就会把缓冲对象保存在vbo里,当然也可以声明一个数组类型,那么创建的3个缓冲对象的名称会依次保存在数组里。
声明一个变量时,使用&VBO,声明一个数组类型,直接使用VBO; C语言, 数组名=数组首元素指针.
已经声明了缓冲对象, 那这个缓冲对象是什么类型,需要用到glBindBuffer();
函数原型:
void glBindBuffer(GLenum target,GLuint buffer);
第一个: 缓冲对象类型
第二个: 要绑定的缓冲对象的名称, 即我们在上一个函数里生成的名称.
按照我的理解 : 确定了VBO缓冲区类型.
在OpenGL红包书中给出了一个恰当的比喻:绑定对象的过程就像设置铁路的道岔开关,每一个缓冲类型中的各个对象就像不同的轨道一样,我们将开关设置为