1.VBO顶点缓冲对象:当我们在顶点着色器中把顶点传送到GPU中的时候,不能每个顶点数据传送一次,因为太耗时而且造成资源浪费,所以就要用到缓冲对象,我们把大量的数据存储在GPU内存上,然后一次传输大量数据到显卡上,顶点缓冲对象就是帮助我们来管理GPU内存的。

关于顶点的数据是如何传入顶点缓冲对象中的,这个可以参考这篇文章:https://mp.csdn.net/postedit/85123077

我们这里关注的是OpenGL如何去拿到顶点缓冲对象里的顶点数据,

首先我们需要使用glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据,对该函数的了解可以参考:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

一定要使用该函数来配置各个属性的数据,因为顶点数据不可能只包含位置,还会包含顶点颜色、顶点法线等等,那一个顶点数据是如何被OpenGL解析然后放入到顶点着色器的各个属性中,就需要通过该函数进行准确的配置。

每个顶点属性从一个VBO管理的内存中获得它的数据,而具体是从哪个VBO(程序中可以有多个VBO)获取则是通过在调用glVetexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的,因为同一个类型的缓冲区同时最多绑定一个目标缓冲。

到这里,大概就应该可以明白数据是如何进入到GPU内存中的,又是如何从GPU内存中读取出来以及OpenGL是如何解析这些数据的。

2.VAO 顶点数组对象

我们每一次绘制的时候,都需要绑定缓冲对象以此来拿到顶点数据,都需要去配置顶点属性指针以便OpenGL知道如何来解析顶点数据,这是相当麻烦的,对一个三角形来说,它每次的这些配置都是相同的,如何来存储这个相同的配置呢。

VAO为我们解决了这个大麻烦,当配置顶点属性数据的时候,只需要将函数调用执行一次,随后再绘制该物体的时候就只需要绑定相应的VAO即可,这样,我们就可以通过绑定不同的VAO(提醒,与VBO一样,同一时刻只能绑定一个VAO),使得在不同的顶点数据和属性配置切换变得非常简单。、

VAO的使用非常简单,要想使用VAO,要做的只是使用glBindVertexArray绑定VAO。从绑定之后起,我们应该绑定和配置对应的VBO和属性指针,配置完以后,VAO中就存储了我们想要的各种数据,之后解绑VAO供之后使用,再次使用需要我们再次绑定。

3.绘制三角形

顶点着色器允许我们指定任何以顶点属性为形式的输入,这里先多废话点,讲一下顶点数据吧,顶点数据不仅仅包括坐标数据,它是由顶点属性表示的,包括顶点位置,顶点颜色,顶点法线,顶点切线等数据。

所以我们要传入的数据不仅仅是位置,还可能有颜色等其它属性数据,当然这里尽量简化了。

我们使用glVertexAttribPointer()函数链接顶点的属性。

它包含了很多参数,具体的讲解可以参考下面的参考资料,这里主要讲解一下第一个参数,因为它涉及到我们之前的一段着色器代码,第一个参数GLuint index,官方解释:Specifies the index of the generic vertex attribute to be modified

在之前的shader里,有这样一段

\"layout(location=0) in vec3 pos\\n\"

这里的location就对应着这里的index,为什么呢,因为OpenGL需要知道要把数据传入那个属性,0就对应着pos这个属性。

4.参考资料:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

收藏 打印