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

2019-05-26 11:40:45 浏览数 (1)

用户输入的数据 以 顶点数组对象表示 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); // 分配缓存对象所需的内存,将顶点对象的数据 拷贝到 缓存对象 内存中

0 人点赞