位置: 编程技术 - 正文

cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND(cocos creator源码)

编辑:rootadmin

推荐整理分享cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND(cocos creator源码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2d原理,cocos源码解析,cocos creator 源码解析,cocos creator 源码解析,cocos creator 源码解析,cocos2dx游戏源码,cocos2dx游戏源码,cocos 源码,内容如对您有帮助,希望把文章链接给更多的朋友!

个人原创,欢迎转载,转载请注明原文地址 上一篇文章介绍了cocos2d-x的基本渲染结构,这篇顺着之前的渲染结构介绍渲染命令QUAD_COMMAND命令的部分,通过这部分的函数,学习opengl处理图片渲染的方法,首先介绍这节需要涉及到的基本概念VAO和VBO。

VAO和VBO:

顶点数组对象(Vertex Array Object 即VAO)是一个包含一个或数个顶点缓冲区对象(Vertex Buffer Object, 即 VBO)的对象,一般存储一个可渲染物体的所有信息。顶点缓冲区对象(VertexBuffer Object VBO)是你显卡内存中的一块高速内存缓冲区,用来存储顶点的所有信息。

这些概念显得很晦涩,简而言之,一般我们绘制一些图形需要将所有顶点的信息存储在一个数组里,但是经常会出现一些点是被重复使用的,这样就会出现一个点的信息的存储空间被重复使用的问题,这样第一会造成存储控件的浪费,第二就是如果我们要修改这个点的信息,需要改多次。所以我们采用索引的方式来描述图形,这样可以用一个数组存储点的信息,另外一个数组存储点的索引,这样所有的点都是不同的,另外把顶点信息存储在显卡的内存中,减少了cpu向gpu传输数据的时间,提高了程序的渲染效率,这就是VBO,在OpenGL3.0中,出现了更进一步的VAO,VBO通过绘制上下文获得绘制状态,VAO可以拥有多个VBO,它记录所有绘制状态,它的代码更简洁,效率更高,在cocos2d-x的绘制中,我们会判断底层是否支持VAO,如果支持VAO,那么优先采用VAO绘制。二者的区别可以从初始化就可以看出来:

需要介绍的两个关键的函数

glBindBuffer:它绑定缓冲区对象表示选择未来的操作将影响哪个缓冲区对象。如果应用程序有多个缓冲区对象,就需要多次调用glBindBuffer()函数:一次用于初始化缓冲区对象以及它的数据,以后的调用要么选择用于渲染的缓冲区对象,要么对缓冲区对象的数据进行更新。

当传入的第二个参数第一次使用一个非零无符号整数时,创建一个新的缓冲区对象;当第二个参数是之前使用过的,这个缓冲区对象成为活动缓冲区对象;如果第二个参数值为0时,停止使用缓冲区对象

glBufferData:保留空间存储数据,他分配一定大小的(第二个参数)的openGL服务端内存,用于存储顶点数据或索引。这个被绑定的对象之前相关联的数据都会被清除。

glBufferData参数介绍

参数1,目标GL_ARRAY_BUFFER或者GL_ELEMENT_ARRAY_BUFFER

参数2,内存容量

参数3,用于初始化缓冲区对象,可以使一个指针,也可以是空

参数4,如何读写,可以选择如下几种

GL_DYNAMIC_DRAW:多次指定,多次作为绘图和图像指定函数的源数据,缓冲区对象的数据不仅常常需要进行更新,而且使用频率也非常高

GL_STATIC_DRAW:数据只指定一次,多次作为绘图和图像指定函数的源数据,缓冲区对象的数据只指定1次,但是这些数据被使用的频率很高

GL_STREAM_DRAW:数据只指定一次,最多只有几次作为绘图和图像指定函数的源数据,缓冲区对象中的数据常常需要更新,但是在绘图或其他操作中使用这些数据的次数较少

从初始化的代码上,为什么VAO反倒复杂了呢?因为他只是把绘制时需要做的一些事情提前放到初始化函数中,来看一下绘制流程。

可以看到,这些设置属性的函数放在了绘制函数里,虽然看似是一样的,但是绘制函数会被调用的更频繁,所以把这些函数放到初始化函数中可以大幅提高程序的效率。

cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND(cocos creator源码)

这里介绍VAO的两个函数:

glMapBuffer函数返回一个指针,指向与第一个参数相关联的当前绑定缓冲区对象的数据存储。第一个参数与glBufferData的第一个参数一致。第二个参数是GL_READ_ONLY、GL_WRITE_ONLY或GL_READ_WRITE之一,表示可以对数据进行的操作。

glUnmapBuffer表示对当前绑定缓冲区对象的更新已经完成,并且这个缓冲区可以释放。

enableVertexAttribs激活相关属性,激活的属性可以调用glVertexAttribPointer指定数据源,可选的有VERTEX_ATTRIB_FLAG_POSITION,VERTEX_ATTRIB_FLAG_COLOR和VERTEX_ATTRIB_FLAG_TEX_COORDS,这里这个参数是激活这三个。

glVertexAttribPointer指定了渲染时第一个参数代表的索引值的顶点属性数组的数据格式和位置。

第一个参数指定要修改的顶点属性的索引值,包括VERTEX_ATTRIB_POSITION(位置),VERTEX_ATTRIB_COLOR(颜色),VERTEX_ATTRIB_TEX_COORDS(纹理坐标)。

第二个参数指定每个属性值的组件数量且必须为1、2、3、4之一。

第三个参数指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT,GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。

第四个参数指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE,意味着整数型的值会被映射至区间[-1,1](有符号整数),或者区间[0,1](无符号整数))或者直接转换为固定点值(GL_FALSE)。

第五个参数指定了一个属性到下一个属性之间的步长(这就允许属性值被存储在单一数组或者不同的数组中)。也就是连续顶点属性之间的偏移量。如果为0,那么它们是紧密排列在一起的。初始值为0。

第六个参数指定一个指针,指向数组中第一个顶点属性的第一个组件。初始值为0。

最后需要调用绘制元素函数,绘制这些信息

它根据索引绘图(注意:顶点数据和索引各自使用不同的缓冲区)

需要注意的是在Renderer的析构函数中要调用glDeleteBuffers来释放它的资源,并使它的标识可以其他缓冲区对象使用。

上一篇中介绍的几种渲染命令中的QUAD_COMMAND(这里把它称作四边形绘制)命令回调用drawBatchedQuads调用绘制函数,处理这个逻辑的命令是这样的:

这个处理主要是把命令存入_batchedQuadCommands中,如果如果Quad数据量超过VBO的大小,那么调用绘制,将缓存的命令全部绘制

如果一直没有超过VBO的大小,drawBatchedQuads绘制函数将在flush被调用时调用

如有错误,欢迎指出

下一篇介绍图形渲染和批处理

cocos2D-X源码分析之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构 个人原创,欢迎转载,转载请注明原文地址

cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND 个人原创,欢迎转载,转载请注明原文地址

cocos2dx3.2 创建界面菜单的简单使用 boolStartLayer::init(){if(!Layer::init()){returnfalse;}autovisibleSize=Director::getInstance()-getVisibleSize();autoorign=Director::getInstance()-getVisibleOrigin();autobg=Sprite::create(LittleGirl.jp

标签: cocos creator源码

本文链接地址:https://www.jiuchutong.com/biancheng/369026.html 转载请保留说明!

上一篇:cocos2D-x初探学习笔记(32)-cocos2d-x & javascript跨平台初体验(cocos 2d x)

下一篇:cocos2D-X源码分析之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构(cocos2d原理)

  • 应付职工薪酬纳税调整
  • 小型微利企业所得税怎么计算
  • 个人所得税抵扣项目有哪些及金额
  • 跨月冲红的发票怎么做会计分录
  • 外购商品捐赠进哪个科目
  • 网银数字证书年费计入什么科目
  • 已经开了发票需要退款怎么处理
  • 土地摊销计入在建工程吗
  • 企业购买电话充值卡的分录
  • 签章是签字还是盖章z还是手印
  • 计提和缴纳企业所得税分录
  • 收到国外提供免费样品怎么入账?
  • 出口供货企业
  • 自查增值税补缴怎么处理
  • 企业出售房屋交什么税
  • 按期汇总缴纳印花税可以退税吗
  • 专用发票的有效期是几年
  • 预缴税款个人所得税如何计算
  • 工行代收资金清算过渡户是什么?
  • 不得抵扣啥意思
  • 银行承兑汇票贴现会计分录
  • 子公司注销后人员怎么安置
  • 固定资产折旧提足怎么办
  • 其他应收款借方和贷方什么意思
  • 实物出资需要发票吗
  • 民间非营利组织会计科目
  • 购买商品未入库
  • 建筑公司分包
  • 微软发布新的免费 Win11 虚拟机 (2302)
  • 固定资产属于金融负债吗
  • 认缴出资日期没到
  • 减免的税款还用做分录吗
  • 工会举办比赛,参赛人员差旅费可以在工会报销吗
  • 红掌的养殖方法和注意事项
  • 长期借款的业务处理
  • php的循环
  • rsa前端解密
  • 草丛里的野花像
  • 个体工商户筹集资金的难易程度
  • zend framework手册
  • 增值税加计抵减申报表怎么填
  • navicat的安装
  • 房产税和城镇土地使用税需要计提吗
  • 前端get请求传数组
  • Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。
  • nodejs官方文档
  • ai绘画网站
  • 企业的会计科目可以任意设置随意修改
  • 旅游业发票怎么抵扣
  • 每个公司都要交房产税吗
  • 行政事业性收据丢了怎么办
  • sql语句表中增加一列
  • 职工体检费用标准规定
  • 生产车间计提费用会计分录
  • 营改增后不动产转让增值税
  • 收到运输服务发票会计分录
  • 支付货款退回如何处理
  • 不动产租赁行业代码
  • 冲上月暂估入账的 会计分录
  • windows隐藏功能
  • windows 10 build 9888
  • 最新版日历
  • freebsd怎么安装软件
  • 惠普hp笔记本电脑
  • window 启动
  • win10系统锁屏后不弹出解锁界面
  • PHP startup: Unable to load dynamic library错误的错误
  • imjpmig是什么进程
  • 虚拟机安装centos7.9
  • win10播放视频的软件
  • Win10系统怎么打开IE浏览器
  • 开发环境配置是干嘛
  • 游戏unity报错
  • js中的垃圾回收机制有哪些方法
  • nodejs 入门
  • 小规模纳税人收到增值税专用发票怎么办
  • 个人所得税代扣代缴手续费返还政策
  • 小规模纳税人营业额
  • 进口车区别
  • 营业收入是含增值税的收入吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设