前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >openGL 入门 2--顶点数组对象 VAO 和 缓存对象 VBO

openGL 入门 2--顶点数组对象 VAO 和 缓存对象 VBO

作者头像
用户1148525
发布2019-05-26 11:40:45
9830
发布2019-05-26 11:40:45
举报

用户输入的数据 以 顶点数组对象表示 Vertex Array Object,VAO

void glGenVertexArrays(GLsizei n, GLuint *arrays); 返回 n个 顶点数组对象 的名称,这些名称存放与数组 arrays 中 Returns n currently unused names for use as vertex-array objects in the array arrays

这个名称类似 C 语言中的一个指针变量,我们必须分配内存并且用名称引用它之后,名称才有意义,这就是 binding an object 机制 void glBindVertexArray(GLuint array); 1)创建一个新的顶点数组对象并且与其名称关联起来;2)激活现有顶点数组对象;3)array 等于0 怎么处理 glBindVertexArray() does three things. When using the value array that is other than zero and was returned from glGenVertexArrays(), a new vertex-array object is created and assigned that name. When binding to a previously created vertex-array object, that vertex array object becomes active, which additionally affects the vertex array state stored in the object. When binding to an array value of zero, OpenGL stops using application-allocated vertex-array objects and returns to the default state for vertex arrays.

代码语言:javascript
复制
enum VAO_IDs { Triangles, NumVAOs };  // 枚举变量
enum Buffer_IDs { ArrayBuffer, NumBuffers };// 枚举变量
GLuint VAOs[NumVAOs];  // 整形数组
GLuint Buffers[NumBuffers]; // 整形数组
glGenVertexArrays(NumVAOs, VAOs); // 生成 NumVAOs 个 顶点数组对象名称 存放于 VAOs 数组中
glBindVertexArray(VAOs[Triangles]); // 创建新的顶点数组对象并与其名称关联起来

Vertex Buffer Object,VBO

顶点着色器。它会在GPU上创建内存用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡。顶点着色器接着会处理我们在内存中指定数量的顶点。

我们通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。

打个简单的比分,类似大家做高铁去目的地,VAO 就像一个个人,VBO 就是高铁,等很多人都到高铁站台了,我们通过 VBO 高铁将大家一起打包快速的送到 目的地(缓存对象 对应的GPU 内存),一个人一个人的送到目的地不划算。

void glGenBuffers(GLsizei n, GLuint *buffers); 返回 n个 缓存对象 的名称,这些名称存放与数组 buffers中 Returns n currently unused names for buffer objects in the array buffers

void glBindBuffer(GLenum target, GLuint buffer); 1)创建一个新的 缓存对象并且与其名称关联起来;2)激活现有 缓存对象;3)buffer 等于0 怎么处理 glBindBuffer() does three things: 1. When using buffer of an unsigned integer other than zero for the first time, a new buffer object is created and assigned that name. 2. When binding to a previously created buffer object, that buffer object becomes the active buffer object. 3. When binding to a buffer value of zero, OpenGL stops using buffer objects for that target.

代码语言:javascript
复制
	Vector3f Vertices[3];
	Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
	Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
	Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);
    
    GLuint VBO;
	glGenBuffers(1, &VBO); // 生成一个可用的缓存对象名称 存放于 VBO
	glBindBuffer(GL_ARRAY_BUFFER, VBO); // 创建一个新的缓存对象,与 VBO 关联
	glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); // 分配缓存对象所需的内存,将顶点对象的数据 拷贝到 缓存对象 内存中
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档