Opengl对象

这里再次强调下,Opengl就是一个状态集合,它负责管理它下属的所有状态,然后这些个状态是怎么表现的,你想象一下啊老哥 玩过游戏吧?举个列子,你用冰冻法术打人别人别冰了这是不是状态?可能不是很恰当,但是你要明白,opengl就是一个状态集合,不同的状态表现不同的特性。然后这些都是需要一个一个的状态的,这些也就是我们的Opengl对象提供的了。当然了说的稍微难理解一点就是,对象是什么?还是一块内存数据,只不过用人很好理解的方式解释了下罢了
接着说,Opengl是个大的状态机有一个大的Context,然后你把任意对象(想象成技能)挂到Context的时候,这个时候Opengl就会变成不同的状态来应对啦。当然了我们改变了这个Context,也会变成其他的状态(这是废话)文字可能很难理解,我找了一张图

这次看看,Context是我们的Opengl状态机,然后下面的Object都是一些Opengl的对象,箭头表示绑定到状态机上,然后这个Context才会因为这些具备不同的状态和特性。明白了吧?还不明白?那再看看 - -


VBO

vertex buffer object 看名字也知道 也是一个Opengl的对象, 而这个也就是我们最关键的东西了,这个千万记住了,顶点缓冲对象,干嘛的?就是用来存储我们前面说过的顶点数据的。现在可以发散一下你的脑洞,想一哈,你所见到的或者你所理解的图形在计算机上咋显示的?还不是一个一个的点或者片段么?然而怎么组织这些点就是在这里说了算了
unsigned VBO;
glGenBuffers(1, &VBO);
看上面的代码就是生成一块VBO的方式

VAO

vertex array object 看名字也知道 也是一个Opengl的对象,它是用来干嘛的?不废话,它就是用来存储上面说的VBO的,你想啊。你见到的一半都是复杂的图形或者图像。几个顶点哪够啊都是大把的,哥哥顶点单独的数据都存在VBO里了,要想把这些点结合起来肯定用个array容器也就是我们的VAO
unsigned VAO;
glGenVertexArrays(1, &VAO);
看上面的代码就是生成一块VAO的方式

EBO

索引缓冲对象, 上面都有两个对象了怎么又来了一个?其实就是一种优化,原理上讲会让大家迷惑但是稍微说一句,一个正方形,是有两个三角形组成的,那么就需要6个顶点,说到这肯定有人跳出来打我。妈的明明四个点就行干嘛用6个?这不是占地方浪费么?说的是说的是,所以也就有了这个东西EBO,用来存放索引
同理EBO这样生成
unsigned EBO;
glGenBuffers(1, &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  // 第二个三角形
};

看出来了吧?

其实说这么多还不如一张图,让大家更能醍醐灌顶。

能看出来了吧? 这是what? VBO用来存放一个点一个点,VAO用来存放一组点 EBO做了层优化可以用来存放索引省去一些点 然后最有用的VAO你可以看到了吧,这么理解吧,VAO就是你的情人,记住了后面一直会用到,就像你做了很多个木头模型,都放到那了,想给别人看啥的时候就拿对应的VAO就完事了。简单吧?


下面是我写的部分生成绑定的代码,注释已经写的相对明白了,大家千万要记住一点就是,bind上了谁接下来状态机就使用的是谁了

   unsigned VBO, VAO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);// 在gl里 bind 谁那么接下来用的就是谁 一个大状态机里面不同对象记录不同状态// bind vao 接下来用的就是上面Gen生成的VaoglBindVertexArray(VAO);// bind vbo 接下来用的vbo就是上面Gen生成的glBindBuffer(GL_ARRAY_BUFFER, VBO);// 往vbo(一块显存)里存放数据glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 同vbo设置数据这里设置数据到ebo里
//    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
//    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 配置vao 因为vao就是一个记录状态用的 状态集合 这里配置好告诉opengl怎么使用vbo的数据 也可以理解为 给对应的顶点属性数组指定数据:glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5* sizeof(float), (GLvoid*)0);glEnableVertexAttribArray(0);//    // 颜色属性 (配置顶点的属性 不同属性位置的不同配置)
//    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3* sizeof(float)));
//    glEnableVertexAttribArray(1);// 新增一个纹理坐标的顶点属性解释glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);

Opengl-基本概念-对象(很关键啊兄弟这章)相关推荐

  1. 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

    文章目录 一.OpenGL 状态机概念 二.OpenGL 矩阵概念 上一篇博客 [OpenGL]八.初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗 ...

  2. 前端怎么自我介绍_实习|猫眼前端面试经历,问问题很关键(已拿offer)

    作者:我是高手高手高高手 链接:https://www.nowcoder.com/discuss/198627 来源:牛客网 一面 面试官比较高冷,问了我很多问题有四五个没答上来.首先是自我介绍,没有 ...

  3. 电子商务跨考计算机,电子商务专业跨考CPA,一次通过五科!具备这“四种能力”很关键!...

    原标题:电子商务专业跨考CPA,一次通过五科!具备这"四种能力"很关键! 作为某四大会计师事务所的一员,没有注会证书,总是过不去的. 王同学是作为应届毕业生的身份报名注会考试,电子 ...

  4. OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)

    原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...

  5. zookeeper是做什么用的_做橱柜用什么门板好 选对很关键

    厨柜是指厨房中存放厨具以及做饭操作的平台.使用明度较高的色彩搭配,由五大件组成,柜体,门板,五金件,台面,电器.整体橱柜变成当今较为盛行的厨房装修方法.那么,做橱柜用什么门板好? 橱柜门板的挑选应慎重 ...

  6. OpenGL顶点阵列对象

    OpenGL顶点阵列对象 OpenGL顶点阵列对象简介 源代码剖析 主要源代码 OpenGL顶点阵列对象简介 第 32 课 - 顶点阵列对象 顶点阵列对象 (或 VAO) 是一种特殊类型的对象,用于封 ...

  7. 国内厂商对鸿蒙系统的态度,鸿蒙系统4月上线,国内手机厂商态度很关键!小米、中兴出乎意料...

    前段时间,华为举行了新品发布会,在这个发布会上,华为宣布了两件事情,第一就是华为全新的折叠屏手机Mate X2正式亮相了,而第二件事情更加让人惊喜,余承东已经确认,华为的鸿蒙系统将会在4月份上线,除了 ...

  8. 互斥对象与关键代码段的比较

    9.6.2 互斥对象与关键代码段的比较 就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性.但是它们在其他属 性方面却各不相同.表 9 - 1 对它们进行了各方面的比较. 表 9-1 互斥对 ...

  9. 4-1 :input表单选择器 jQuery第四章 很关键 好像 刚好可以解决 微信自动回复...

    jQuery第四章 很关键 好像 刚好可以解决 微信自动回复 $("#frmTest :input")   //冒号之前一定要有空格 :input表单选择器 如何获取表单全部元素? ...

最新文章

  1. 原生 Java 客户端进行消息通信
  2. python爬虫搜特定内容的论文_Python 爬虫爬取指定博客的所有文章
  3. @Autowired自动注入
  4. Java对象的序列化和反序列化(转)
  5. IDC 2019Q1云市场报告重磅出炉;英特尔与百度签署3年新协议;谷歌收购云存储公司 Elastifile,增强自家……...
  6. vscode 结束_21 个VSCode 快捷键,让代码更快,更有趣
  7. 怎么将文件转换成linux文件,你如何在linux中创建一个将文件转换为大写...
  8. 使用Docker Swarm来运行服务
  9. ElementUI:el-container实现高度占满
  10. python实现搜索功能_python实现百度识图搜索功能
  11. Backtrader系列教程⑦:可视化篇(重构)
  12. 易飞9安装和授权视频
  13. OpenCV局部阙值分割的自适应阙值算法
  14. Linux nohup用法
  15. Linux下数据库表结构导入导出
  16. 桌面宠物 ① 通过python制作属于自己的桌面宠物
  17. android 股票行情界面,Android版的股票行情K线图开发
  18. python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)
  19. docker no2.
  20. PAT甲级 1071 说话方式

热门文章

  1. 理解数据成员指针、函数成员指针
  2. lind.ddd博客笔记索引
  3. react编译器jsxTransformer,babel
  4. Web Service 开发系列文章之三(一个较小的契约优先的Web Service例子,用JavaApplication发布)...
  5. __call处理调用错误
  6. python文件对象提供了3个读方法、分别是-Python读写文件模式和文件对象方法实例详解...
  7. 编程软件python下载怎么读-使用最方便的计算机编程软件,Python下载使用完美教程...
  8. pythonweb开发-如何用Python做Web开发?——Django环境配置
  9. python运行程序-Python程序的执行过程
  10. python最新版本-官方宣布不再维护Python2,并每年发布一个新版本