看opengl写代码(9)使用顶点数组(VAO)

博主初学,欢迎来喷!

VAO: 英文全称 Vertex Array OBject,,顶点数组对象;

VBO:Vertex Buffer Object,顶点缓冲区对象。

VAO 要和 VBO 一起 使用 才能 提高效率。

VBO 是 将 顶点 数据 从 客户端 传输到 服务器端(GPU) ,从而 提高 效率。

VAO 是 在 几组 顶点 数组 之间 快速 切换;

顶点数组 相关的 OpenGl函数 就两个:

1.glGenVertexArrays: 申请顶点 数组 对象 ,返回 n个 顶点数组对象的 id

2.glBindVertexArray : 绑定顶点数组 对象

glBindVertexArray有 三重含义:

1.如果绑定的数组id是 从 glGenVertexArray 返回的 将会 对 这个数组进行 分配 和 初始化;

2.如果绑定的数组id 是 之前 已经分配和 初始化的,将会 将 这组顶点数组变成活动的。

3.如果绑定的数组id 是0, 表示 禁止 禁止 使用顶点数组对象。

下面 上 代码:

// VAO.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <gl/glew.h>#include <gl/glut.h>#pragma comment(lib,"glew32.lib")#define BUFFER_OFFSET(offset)((GLvoid*)((offset) + NULL))static GLuint Vao[2];//Vertex Array Objectstatic GLuint Vbo[2];//三角形顶点数据GLfloat triangleVertexs [][3] = {{-0.8,-0.8,0},{-0.2,-0.2,0},{0.5,-0.8,0},};GLfloat triangleColors[][3] = {{1,0,0},{0,1,0},{0,0,1},};//四角形顶点数据GLfloat rectVertexs [][3] = {{-0.6,0,0},{0.5,0,0},{0.5,0.8,0},{-0.6,0.8,0},};GLfloat rectColors[][3] = {{1,0,0},{0,1,0},{0,0,1},{1,1,0},};void init(){glClearColor(0,0,0,0);//申请vaoglGenVertexArrays(2,Vao);//申请Vbovertex && colorglGenBuffers(2,Vbo);//设置 三角形 需要 信息//绑定vaoglBindVertexArray(Vao[0]);//绑定bufferglBindBuffer(GL_ARRAY_BUFFER,Vbo[0]);//设置bufferglBufferData(GL_ARRAY_BUFFER,sizeof(triangleVertexs),triangleVertexs,GL_STATIC_DRAW);//启动顶点glEnableClientState(GL_VERTEX_ARRAY);//设置顶点属性glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));//颜色bufferglBindBuffer(GL_ARRAY_BUFFER,Vbo[1]);glBufferData(GL_ARRAY_BUFFER,sizeof(triangleColors),triangleColors,GL_STATIC_DRAW);glEnableClientState(GL_COLOR_ARRAY);glColorPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));//设置四边形 信息glGenBuffers(2,Vbo);//绑定vaoglBindVertexArray(Vao[1]);//绑定bufferglBindBuffer(GL_ARRAY_BUFFER,Vbo[0]);//设置bufferglBufferData(GL_ARRAY_BUFFER,sizeof(rectVertexs),rectVertexs,GL_STATIC_DRAW);//启动顶点glEnableClientState(GL_VERTEX_ARRAY);//设置顶点属性glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));//颜色bufferglBindBuffer(GL_ARRAY_BUFFER,Vbo[1]);glBufferData(GL_ARRAY_BUFFER,sizeof(rectColors),rectColors,GL_STATIC_DRAW);glEnableClientState(GL_COLOR_ARRAY);glColorPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));}void display(){glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(Vao[0]);//重新激活顶点数组glDrawArrays(GL_TRIANGLES,0,3);glBindVertexArray(Vao[1]);glDrawArrays(GL_QUADS,0,4);glFlush();}int _tmain(int argc, _TCHAR* argv[]){glutInit(&argc,(char**) argv);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow("VAO && VBO");glewInit();init();glutDisplayFunc(display);glutMainLoop();return 0;}运行截图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

带着我的相机和电脑,远离繁华,走向空旷。

看opengl写代码(9)使用顶点数组(VAO)

相关文章:

你感兴趣的文章:

标签云: