OpenGl
目标:区分好VAO,VBO,EBO;懂得大致渲染管线的流程就可以了,会渲染简单的三角形
你好三角形
openGl有一套渲染管线,将3D的物体渲染到2D的平面上。在这个阶段我们只需要关注顶点着色器和片段着色器。
顶点着色器:将输入的顶点信息进行处理输出另一种坐标信息,该阶段要完成的任务有:将顶点信息存储到GPU,告诉GPU如何解释这些顶点,以及如何发到GPU。
第一个问题:如何快速将顶点发送到GPU,这就需要一个叫做顶点缓冲对象VBO的东西,管理这些顶点所在的内存。顶点缓冲是一个顶点缓冲类型,于是乎他就可以来存储顶点。使用gbindbuffer(GL_ARRAY_BUFFER,VBO),绑定缓冲类型,一旦绑定了缓冲类型,他就可以有对应类型的作用了,比如这里就是说它具有存储顶点的作用,现在啊,他就是一个容器。然后我们是不是应该往里边放东西了呢?接下来使用这个glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW),这个函数就是把数据给复制到这个缓冲(容器)中来,【这里仅仅解释最后一个参数,作用就是,我们放到这里边的数据是不是经常变,因为如果数据要是经常变我们就放到动态缓冲的地方,这样读写速度就会很快】。
片段着色器:、、、、、
当我们存到了gpu内存中,我们要告诉gpu如何对这些数据进行解释,
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
注: VBO是管理内存的对象,可能会有多个VBO哦,因此我们必须在解释内存的时候告诉我们是要解释的是哪一段内存,也就是确定下来VBO,如何确定呢?就是通过glVertexAttribPointer()函数绑定的GL_ARRAY_BUFFER来决定,因为我们在之前是将一个VBO绑到了这里的缓冲类型,所以我们此处使用的已经绑定的VBO。
VAO:怎末说呢这东西真的我看了好久还是很迷糊,我简单理解下,VBO存的是顶点属性信息,像顶点位置啥的?VAO存的是啥,就是如何解释这些顶点信息的信息,比如像之前说的,在0位置,3个量长度,步长多少那种。这样的目的你想啊,它可以用来干啥呢?我不用每次都告诉这样解释了把,我下次直接搬出来VAO,他是不是直接就知道哦原来是这样解释的。
EBO:我们当用上边的流程绘制一个矩形的时候是不是,要绘制两个三角形,凑到一块才能绘制成一个矩形,那是不是有的边就会被重复绘制。
unsigned int VAO[2], VBO[2], EBO;
glGenVertexArrays(2, VAO);
glGenBuffers(2, VBO);
glGenBuffers(1, &EBO);
// 绑定VAO[0]并设置数据
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
// 设置EBO的数据
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 绑定VAO[1]并设置数据
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
// 设置EBO的数据
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 启用顶点属性数组
glEnableVertexAttribArray(0);
注意: 看到上边代码了吗,这是多个VAO,VBO的共同作用的结果,然而这对我们关于绑定EBO,VBO到对应的VAO一定要小心谨慎,可能前一个VAO绑上了,后一个没有绑上,所以我在其中是不是就有一些这个重复的多个代码。