OpenGL Two (Triangle__EBO)
时间:2019-11-16
本文章向大家介绍OpenGL Two (Triangle__EBO),主要包括OpenGL Two (Triangle__EBO)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
冠冕堂皇的引言
之前已经画了一个憨憨的三角形。如果是画由两个三角形组成的四边形的话......
float vertices[] = {
// 第一个三角形
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, 0.5f, 0.0f, // 左上角
// 第二个三角形
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
此时就会出现一个问题,我们指定右下角和左上角两次,就显得有一丝的多余。所以我们引入了索引缓冲对象( Element Buffer Object , EBO )( 也叫IBO,Index Buffer Object )的概念。
索引缓冲对象
- 和顶点缓冲对象( VBO )一样,EBO也是一个缓冲,只不过他只储存索引罢了。
- OpenGL通过EBO来明确该绘制哪个顶点。
使用方法
- 首先定义不重复的顶点 和 绘制矩形所需要的索引
float vertices[] = {
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
unsigned int indices[] = { // 注意索引从0开始!
0, 1, 3, // 第一个三角形
1, 2, 3 // 第二个三角形
};
- 创建索引缓冲对象( EBO )
unsigned int EBO;
glGenBuffers(1,&EBO);
//以上代码生成了一个EBO缓冲
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
//以上代码把刚刚生成的EBO缓冲绑定到GL_ELEMENT_ARRAY_BUFFER目标上
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
//以上代码的作用是把指点定义的索引顺序数据复制到缓冲中
和VBO类似,以上所有代码建立了顶点绘制顺序数据与EBO之间的联系,应为之前已经定义了VAO缓冲而且帮点了Element Buffer,也就建立了顶点绘制顺序与VAO之间的关系。
绘制
- 在实际绘制的时候,因为我们传递了GL_ELEMENT_ARRAY_BUFFER当作缓冲目标。所以要用glDrawElements 来替换 glDrawArrays 函数,来指明我们从索引缓冲渲染。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
- 对于glDrawElements函数
- 第一个参数指定了绘制模式
- 第二个参数是我们打算绘制顶点的个数
- 第三个参数是索引的类型
- 最后一个参数是偏移量
效果图和憨憨代码
( 代码照着上次的改一下就
原文地址:https://www.cnblogs.com/LittleBanana/p/11872262.html
- hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )
- Java 基础知识点(必知必会其二)
- Java 基础知识点(必知必会其一)
- PyQt5 GUI应用程序工具包入门(3)—信号槽
- web基础之hibernate(一篇)
- 微信小程序头脑王者辅助神器
- web基础之Structs(一篇)
- S3上传代码用例-golang
- jsp-------------之分页技术(一)
- ------------数据库的加锁操作(上)
- 对象存储基础概念
- 关于byte[]字节传输的大端和小端小议
- hdu 2818 Building Block
- hdu 3074 Zjnu Stadium (带权并查集)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 脏读,不可重复读,幻读
- 建议收藏!这份MySQL 连接查询超全详解送给你
- Redis点赞新思路 bitmap
- PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
- deepin使用
- 解决deepin下安装sqlite3依赖过新的问题
- PyQt5 技术篇-调用文件对话框获取文件、文件夹路径。文件对话框返回选中的多个文件路径
- deepin安装golang
- PyQt5 技术篇-调用输入对话框(QInputDialog)获取用户输入内容。
- Python+selenium 自动化-通过窗口名切换窗口,如何获取当前窗口的title窗口名
- deepin 任务栏消失问题
- PyQt5 技术篇-调用消息对话框(QMessageBox)进行简单提示!
- composer改源
- Android内存管理(四)Linux的内存管理机制
- JavaScript 技术篇-js通过xpath获取dom节点,js校验xpath唯一性。