矩形的绘制
前面已经说过三角形的绘制方式,现在我们逐步进入到矩形的绘制。
矩形在GPU的组成
在GPU里,矩形是由两个三角形组成的 所以我们可以定义一下矩形的定点
代码编写
float vertices[] = {
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
GLuint indices[] = { // 注意索引从0开始!
0, 1, 3, // 第一个三角形
1, 2, 3 // 第二个三角形
};
首先我们像前面几章讲的,先把顶点数据输入
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (void*)0);
glEnableVertexAttribArray(0);
在这里,我们以为有多个三角形,故需要指明三角形的连接方式,这里就需要引入一个EBO
的概念。
GLuint EBO;
glGenBuffers(1, &EBO);
// 3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
EBO
可以自行百度或者是去learnopengl.cn
看看
绑定完成EBO
后,就可以启动渲染了
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glDrawElements
它会按照我们传入的顶点顺序和指定的绘制方式进行绘制。
glDrawElements 和 glDrawArrays 的对比
glDrawElements
方法的count
的参数定义了要取多少个索引出来绘制,而且这个绘制是连续的,必须要把 count 数量的顶点绘制完。
这里就有一个很有意思的地方了,有一些小游戏是这样的:要求一笔绘制完一个形状,而且不允许交叉。
比如,要求一笔绕过立方体的六个面,而且不允许交叉,这就很难做到的了。
而使用glDrawElements
方法同样会这样,采用索引不能一次不交叉的把图形全部绘制完,得采取两次绘制。
而对于使用glDrawArrays
的方式,可以一次性把所有顶点传到渲染管线,并且可以选择绘制的开始和结尾点,这样就只要一个缓冲区就好了,不过代码就是要多占用内存空间了。
PREVIOUSopengl基础学习(4)
NEXT快速排序