3D Computer Grapihcs Using OpenGL - 05 EBO

本节将采用两种方法绘制两个三角形。

先看第一种方法的代码

MyGlWindow.cpp

 1 #include <gl\glew.h>
 2 #include "MyGlWindow.h"
 3
 4 void MyGlWindow::initializeGL()
 5 {
 6     glewInit();
 7
 8     GLfloat verts[] =
 9     {
10         +0.0f, +0.0f,
11         +1.0f, +1.0f,
12         -1.0f, +1.0f,
13
14         +0.0f, +0.0f,
15         -1.0f, -1.0f,
16         +1.0f, -1.0f,
17     };
18     GLuint myBufferID;
19     glGenBuffers(1, &myBufferID);
20     glBindBuffer(GL_ARRAY_BUFFER, myBufferID);
21     glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
22     glEnableVertexAttribArray(0);
23     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
24 }
25
26 void MyGlWindow::paintGL()
27 {
28     glViewport(0, 0, width(), height());
29     glDrawArrays(GL_TRIANGLES, 0, 6);
30 }

和上一节的代码很相似,区别是verts数组增加了6个元素(能额外表示3个顶点),另外glDrawArrays()函数的最后一个参数变成了6,表示绘制六个顶点。这样当然就可以绘制2个三角形了。

但是这种方法造成了一个浪费,代码中可以看到两次出现了(0.0,0.0)点。

EBO

OpenGL允许我们提供一个索引数组用来指定三角形的顶点组成顺序。这个数组通常被称为EBO。

看第二种绘制三角形的方法:

 1 #include <gl\glew.h>
 2 #include "MyGlWindow.h"
 3
 4 void MyGlWindow::initializeGL()
 5 {
 6     glewInit();
 7
 8     GLfloat verts[] =
 9     {
10         +0.0f, +0.0f, //0
11         +1.0f, +1.0f, //1
12         -1.0f, +1.0f, //2
13         -1.0f, -1.0f, //3
14         +1.0f, -1.0f, //4
15     };
16     GLuint vertexBufferID;
17     glGenBuffers(1, &vertexBufferID);
18     glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
19     glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
20     glEnableVertexAttribArray(0);
21     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
22
23     GLushort indices[] =
24     {
25         0,1,2,
26         0,3,4,
27     };
28     GLuint indexBufferID;
29     glGenBuffers(1, &indexBufferID);
30     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
31     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
32 }
33
34 void MyGlWindow::paintGL()
35 {
36     glViewport(0, 0, width(), height());
37     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
38 }

*注:为了区分两个Buffer,我们这里把之前的myBufferID改名为vertexBufferID

23-31行和顶点位置设置代码(8-19行)非常相似。

28-29行创建了另外一个BufferObject- indexBuffer

30行把indexBuffer绑定到GL_ELEMENT_ARRAY_BUFFER绑定点上

31行对其填充数据,其数据内容是一个GLushort类型的数组,每三个元素表示一个三角形的顶点索引,索引值是相对于verts数组来说的(参考verts中的注释)。这里使用GLushort而不使用GLint的原因是GLushort给了我们更大的数据存储量,索引始终都是正整数,所以使用unsigned类型更合理。

在paintGL函数中,这次不使用glDrawArrays函数了,改用glDrawElements()函数绘制

第二个参数表示6个顶点

第三个参数表示indices数组的类型

第四个参数表示偏移值

使用EBO在本例中仅节约了一个顶点位置数据,但是在复杂的模型中,会节约非常多的数据。

原文地址:https://www.cnblogs.com/AnKen/p/8331198.html

时间: 2024-10-14 20:11:26

3D Computer Grapihcs Using OpenGL - 05 EBO的相关文章

3D Computer Grapihcs Using OpenGL - 10 Color Buffer

本节我们将尝试利用三角形制作一个"走马灯"效果. 一个三角形如图示方式,从左向右依次移动. 先看一下代码: MyGlWindow.cpp 1 #include <gl\glew.h> 2 #include "MyGlWindow.h" 3 #include <iostream> 4 #include <fstream> 5 6 float triangleWidth = 0.1f; 7 float bytesPerTriangle

3D Computer Grapihcs Using OpenGL - 07 Passing Data from Vertex to Fragment Shader

上节的最后我们实现了两个绿色的三角形,而绿色是直接在Fragment Shader中指定的. 这节我们将为这两个三角形进行更加自由的着色--五个顶点各自使用不同的颜色. 要实现这个目的,我们分两步进行,首先 在顶点数组里增加数据用来表示颜色 修改sendDataToOpenGL()函数中的verts数组: 1 GLfloat verts[] = 2 { 3 +0.0f, +0.0f, //Vertex 0 4 +1.0, +0.0, +0.0f, //Color 0 5 +1.0f, +1.0f

3D Computer Grapihcs Using OpenGL - 08 Text File Shaders

使用之前的方法写Shader是一件很痛苦的事情,把Shader代码直接卸载C++文件中,需要使用很多引号来包裹,既不美观也不方便. 我们这节的目的是使用纯文本文件保存Shader. 首先在工程中创建两个文件,分别命名为VertexShaderCode.glsl 和 FragmentShaderCode.glsl,后缀名可以自己随意指定,不一定非要是glsl. 然后把上节的Shader代码拷贝到两个文件中去. VertexShaderCode.glsl 1 #version 430 2 3 in

3D Computer Grapihcs Using OpenGL - 20 结合Buffer

在上一节的案例中,我们使用了四个Buffer Object,立方体的VertexBuffer,立方体的索引Buffer,四面体的VertexBuffer,四面体的索引Buffer. 我们这节尝试把两个图形的Vertex Buffer结合,两个图形的索引Buffer结合,形成两个Buffer,让程序更加简化. 先看最终代码: MyGlWindow.cpp: 1 #include <gl\glew.h> 2 #include "MyGlWindow.h" 3 #include

3d引擎列表

Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. Axiom 引擎 - OGRE的衍生引擎. Baja 引擎 - 专业品质的图像引擎,用于The Lost Mansion. Boom - Doom代码的一部分.由TeamTNT开发 Build 引擎 - 一个第一人称射击游戏引擎,用于Duke Nukem 3D. BYOND - “Build Your Own

OpenCV 与 OpenGL 的关系是什么?

OpenCV是 Open Source Computer Vision LibraryOpenGL是 Open Graphics LibraryOpenCV主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法.比如你想实现视频的降噪.运动物体的跟踪.目标(比如人脸)的识别这些都是CV的领域OpenGL则专注在Graphics,3D绘图.其实两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是

&lt;转载&gt; OpenGL Projection Matrix

原文 OpenGL Projection Matrix Related Topics: OpenGL Transformation Overview Perspective Projection Orthographic Projection Updates: The MathML version is available here. Overview A computer monitor is a 2D surface. A 3D scene rendered by OpenGL must b

opencv和openGL的关系

OpenCV是 Open Source Computer Vision Library OpenGL是 Open Graphics Library OpenCV主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法.比如你想实现视频的降噪.运动物体的跟踪.目标(比如人脸)的识别这些都是CV的领域 OpenGL则专注在Graphics,3D绘图. 其实两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)