记录个人基于QT的OpenGL开发学习
如标题,本篇文章将介绍矩形显示方法
原理:OpenGL所创建的物体和场景是由更小、更简单的形状组成的,并且按照各种各样独一无二的方式进行排列和组合的,这些组成3D物体的建筑块,称为图元(Primivtives).
所有图元都是一维、二维、三维的物体,从点到线直到复杂的多边形都是如此.
引申开来,矩形的实现方法则是可由两个三角形图元拼凑出来
一、矩形实现与三角形实现区别之处
引入概念:元素缓冲对象
元素缓冲对象(Element Buffer Object,EBO),也叫索引缓冲对象(Index Buffer Object,IBO)。EBO是一个缓冲区,就像一个顶点缓冲区对象一样,它存储 OpenGL 用来决定要绘制哪些顶点的索引。这种所谓的索引绘制(Indexed Drawing)正是我们问题的解决方案。
个人理解:就是在图元排列使用过程中,将繁复多余的顶点数组进行简化,对应索引可以方便查找使用,以避免无谓的开销。
例:两个三角形构成矩形:
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, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
可以看出,有明显重复的地方,从而造成没必要的开销,尤其在需要更多的使用图元的时候,这种时候使用索引缓冲,一切就变得流畅多了
//只有四个顶点
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 // 左上角
};
unsigned int indices[] = {
// 注意索引从0开始!
// 此例的索引(0,1,2,3)就是顶点数组vertices的下标,
// 这样可以由下标代表顶点组合成矩形
0, 1, 3, // 第一个三角形
1, 2, 3 // 第二个三角形
};
下一步创建元素缓冲对象(EBO)
unsigned int EBO;
glGenBuffers(1, &EBO);
创建EBO后同样需要使用glBindBuffer进行绑定并使用glBufferData把索引复制到缓冲里,注意这里缓冲的类型定义为GL_ELEM