• OpenGL笔记五之VBO与VAO


    OpenGL笔记五之VBO与VAO

    总结自bilibili赵新政老师的教程

    code review!

    1.VBO

    在这里插入图片描述

    代码

    void prepareVBO() {
    	//1 创建一个vbo  *******还没有真正分配显存*********
    	GLuint vbo = 0;
    	GL_CALL(glGenBuffers(1, &vbo));
    
    	//2 销毁一个vbo
    	GL_CALL(glDeleteBuffers(1, &vbo));
    
    	//3 创建n个vbo
    	GLuint vboArr[] = {0, 0, 0};
    	GL_CALL(glGenBuffers(3, vboArr));
    
    	//4 销毁n个vbo
    	GL_CALL(glDeleteBuffers(3, vboArr));
    }
    
    void prepare() {
    	float vertices[] = {
    		   -0.5f, -0.5f, 0.0f,
    			0.5f, -0.5f, 0.0f,
    			0.0f,  0.5f, 0.0f
    	};
    
    	//1 生成一个vbo
    	GLuint vbo = 0;
    	GL_CALL(glGenBuffers(1, &vbo));
    
    	//2 绑定当前vbo,到opengl状态机的当前vbo插槽上
    	//GL_ARRAY_BUFFER:表示当前vbo这个插槽
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    
    	//3 向当前vbo传输数据,也是在开辟显存
    	GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
    }
    
    void prepareSingleBuffer() {
    	//1 准备顶点位置数据与颜色数据
    	float positions[] = {
    		   -0.5f, -0.5f, 0.0f,
    			0.5f, -0.5f, 0.0f,
    			0.0f,  0.5f, 0.0f
    	};
    	float colors[] = {
    	   1.0f, 0.0f, 0.0f,
    	   0.0f, 1.0f, 0.0f,
    	   0.0f,  0.0f, 1.0f
    	};
    
    	//2 为位置&颜色数据各自生成一个vbo
    	GLuint posVbo = 0, colorVbo = 0;
    	GL_CALL(glGenBuffers(1, &posVbo));
    	GL_CALL(glGenBuffers(1, &colorVbo));
    
    	//3 给两个分开的vbo各自填充数据
    	//position填充数据
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, posVbo));
    	GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW));
    
    	//color填充数据
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, colorVbo));
    	GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW));
    }
    
    void prepareInterleavedBuffer() {
    	float vertices[] = {
    		   -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
    			0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,
    			0.0f,  0.5f, 0.0f, 0.0f, 0.0f, 1.0f
    	};
    
    	GLuint vbo = 0;
    	GL_CALL(glGenBuffers(1, &vbo));
    
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    
    	GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
    
    }
    

    2.VAO

    在这里插入图片描述

    代码

    void prepareSingleBuffer() {
    	//1 准备positions colors数据
    	float positions[] = {
    		   -0.5f, -0.5f, 0.0f,
    			0.5f, -0.5f, 0.0f,
    			0.0f,  0.5f, 0.0f
    	};
    	float colors[] = {
    	   1.0f, 0.0f, 0.0f,
    	   0.0f, 1.0f, 0.0f,
    	   0.0f,  0.0f, 1.0f
    	};
    
    
    	//2 使用数据生成两个vbo posVbo, colorVbo
    	GLuint posVbo, colorVbo;
    	glGenBuffers(1, &posVbo);
    	glGenBuffers(1, &colorVbo);
    
    	glBindBuffer(GL_ARRAY_BUFFER, posVbo);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
    
    	glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    
    	//3 生成vao并且绑定
    	GLuint vao = 0;
    	glGenVertexArrays(1, &vao);
    	glBindVertexArray(vao);
    
    	//4 分别将位置/颜色属性的描述信息加入vao当中
    	//4.1描述位置属性
    	glBindBuffer(GL_ARRAY_BUFFER, posVbo);//只有绑定了posVbo,下面的属性描述才会与此vbo相关
    	glEnableVertexAttribArray(0);
    	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    
    	//4.2 描述颜色属性
    	glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
    	glEnableVertexAttribArray(1);
    	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    
    	glBindVertexArray(0);
    }
    
    
    void prepareInterleavedBuffer() {
    	//1 准备好Interleaved数据(位置+颜色)
    	float vertices[] = {
    		   -0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,
    			0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,
    			0.0f,  0.5f, 0.0f,  0.0f,  0.0f, 1.0f
    	};
    
    
    	//2 创建唯一的vbo
    	GLuint vbo = 0;
    	GL_CALL(glGenBuffers(1, &vbo));
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    	GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
    
    	//3 创建并绑定vao
    	GLuint vao = 0;
    	GL_CALL(glGenVertexArrays(1, &vao));
    	GL_CALL(glBindVertexArray(vao));
    
    
    	GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    	//4 为vao加入位置和颜色的描述信息
    	//4.1 位置描述信息
    	GL_CALL(glEnableVertexAttribArray(0));
    	GL_CALL(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0));
    
    	//4.2 颜色描述信息
    	GL_CALL(glEnableVertexAttribArray(1));
    	GL_CALL(glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))));
    
    	//5 扫尾工作:解绑当前vao
    	glBindVertexArray(0);
    }
    

    3.VBO与VAO对比

    在这里插入图片描述

  • 相关阅读:
    【正点原子STM32连载】第八章 新建HAL版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    DTD建模
    宝塔部署nginx遇到的400错误和502错误
    c++编写简易版2048小游戏
    GameStop熊市杀入NFT交易,老牌游戏零售商借Web3焕发第二春
    基于Echarts实现可视化数据大屏厅店营业效能分析
    学信息系统项目管理师第4版系列29_信息系统治理
    js返回上一页和刷新页面
    C++入门篇10---stack+queue+priority_queue
    前端框架海洋:如何破浪前行,寻找你的“黄金舟”
  • 原文地址:https://blog.csdn.net/weixin_43297891/article/details/140388774