opengl基础学习(5)

矩形的绘制

前面已经说过三角形的绘制方式,现在我们逐步进入到矩形的绘制。

矩形在GPU的组成

在GPU里,矩形是由两个三角形组成的 png 所以我们可以定义一下矩形的定点

代码编写

    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的方式,可以一次性把所有顶点传到渲染管线,并且可以选择绘制的开始和结尾点,这样就只要一个缓冲区就好了,不过代码就是要多占用内存空间了。