cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

手游安全之cocos2d-x的源码浅析(手游逆向与防护) 一、cocos2d-x框架结构 二、cocos2d-x引擎架构 三、cocos2d-x源码结构 四、cocos2d-x源码解析 1.luaLoadBuffer函数分析 cocos2d-x-3.16/cocos/scripting/lua-bindings/manual/CCLuaStack.h cocos2d-x-3.16/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp 2.applicationDidF 阅读详情

个人原创,欢迎转载,转载请注明原文地址http://blog.youkuaiyun.com/bill_man

上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处理渲染命令BatchCommand,批处理命令的处理在Render中比较简单

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. else if(commandType == RenderCommand::Type:: BATCH_COMMAND)  
  2. {  
  3.      //将之前缓存的绘制  
  4.      flush();  
  5.      auto cmd = static_cast<BatchCommand*>(command);  
  6.      //调用命令  
  7. cmd->execute()  
  8. }  

首先调用flush将之前缓存的VBO绘制出来,然后调用命令自己的执行函数,这个过程和CUSTOM_COMMAND是一样的,不同的是这里的execute调用的是BatchCommand确定的绘制函数,CUSTOM_COMMAND调用是传入的func函数,这里看一下BatchCommand的execute函数。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void BatchCommand::execute()  
  2. {  
  3.     //设置渲染材质  
  4.     //shader  
  5.     _shader->use();  
  6.     //先取得MV和P,然后将MV和P相乘得到MVP,即模型视图投影矩阵  
  7.     _shader->setUniformsForBuiltins(_mv);  
  8.     //选择纹理单元,建立一个绑定到目标纹理的有名称的纹理  
  9.     GL::bindTexture2D(_textureID);  
  10.     //混合  
  11.     GL::blendFunc(_blendType.src, _blendType.dst);  
  12.     //绘制  
  13.     _textureAtlas->drawQuads();  
  14. }  

首先介绍其中一个重要的概念MVP,MVP即模型(Model)、视图(View)、投影(Projection)。

模型矩阵:所有物体都处于世界空间中,所以绘制和做变换的前提是把物体由模型空间转换到世界空间中,而这个转换就需要乘以模型矩阵。

视图矩阵:下一步需要把世界空间转换到相机空间或者是视角空间中,这需要乘以视图矩阵。

投影矩阵:最后需要将3d的立方体投影到一个2d平面上,需要从观察坐标系到齐次坐标系,需要乘以投影矩阵。整个过程如下图所示:



setUniformsForBuiltins函数

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GLProgram::setUniformsForBuiltins(const kmMat4 &matrixMV)  
  2. {  
  3.     //通过flag中的变量判断是否使用了相关的矩阵,这些标志变量在updateUniforms被设置  
  4.     kmMat4 matrixP;  
  5.       
  6.     kmGLGetMatrix(KM_GL_PROJECTION, &matrixP);  
  7.   
  8.     if(_flags.usesP)  
  9.         setUniformLocationWithMatrix4fv(_uniforms[UNIFORM_P_MATRIX], matrixP.mat, 1);  
  10.   
  11.     if(_flags.usesMV)  
  12.         setUniformLocationWithMatrix4fv(_uniforms[UNIFORM_MV_MATRIX], matrixMV.mat, 1);  
  13.   
  14.     if(_flags.usesMVP) {  
  15.         kmMat4 matrixMVP;  
  16.         kmMat4Multiply(&matrixMVP, &matrixP, &matrixMV);  
  17.         setUniformLocationWithMatrix4fv(_uniforms[UNIFORM_MVP_MATRIX], matrixMVP.mat, 1);  
  18.     }  
  19.   
  20.     if(_flags.usesTime) {  
  21.         Director *director = Director::getInstance();  
  22.         //这里不会使用真实的每帧时间去设置,那样太耗费效率  
  23.         float time = director->getTotalFrames() * director->getAnimationInterval();  
  24.           
  25.         setUniformLocationWith4f(_uniforms[GLProgram::UNIFORM_TIME], time/10.0, time, time*2, time*4);  
  26.         setUniformLocationWith4f(_uniforms[GLProgram::UNIFORM_SIN_TIME], time/8.0, time/4.0, time/2.0, sinf(time));  
  27.         setUniformLocationWith4f(_uniforms[GLProgram::UNIFORM_COS_TIME], time/8.0, time/4.0, time/2.0, cosf(time));  
  28.     }  
  29.       
  30.     if(_flags.usesRandom)  
  31.         setUniformLocationWith4f(_uniforms[GLProgram::UNIFORM_RANDOM01], CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1());  
  32. }  

这个函数里,有一个频繁出现的变量名uniforms,uniform是一种和着色器相关的,它必须被声明为全局变量,用于整个图元批次向保持不变的着色器传递数据,对于顶点着色器来说,可能最普遍的统一值就是变换矩阵,它通过调用glUniformXXXX系列函数向着色器传递数据,这里这个函数被封装了,调用setUniformLocationXXXX系列函数可以设置uniforms,这个函数首先通过调用updateUniformLocation函数判断这个uniforms的值是否确实被更新(在一个hash表里存上曾经设置过的键值对),如果确实需要被更新再调用glUniformXXXX更新这个uniforms,节约效率

bindTexture2DN函数主要是调用glActiveTexture和glBindTexture做贴图的绑定

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void bindTexture2DN(GLuint textureUnit, GLuint textureId)  
  2. {  
  3. #if CC_ENABLE_GL_STATE_CACHE  
  4.     //做缓存,那么就不用为相同的textureId重复调用了  
  5.     CCASSERT(textureUnit < kMaxActiveTexture, "textureUnit is too big");  
  6.     if (s_currentBoundTexture[textureUnit] != textureId)  
  7.     {  
  8.         s_currentBoundTexture[textureUnit] = textureId;  
  9.         activeTexture(GL_TEXTURE0 + textureUnit);  
  10.         glBindTexture(GL_TEXTURE_2D, textureId);  
  11.     }  
  12. #else  
  13.       
  14.     glActiveTexture(GL_TEXTURE0 + textureUnit);  
  15.     glBindTexture(GL_TEXTURE_2D, textureId);  
  16. #endif  
  17. }  

glActiveTexture选择一个纹理单元,线面的纹理函数将作用于该纹理单元上,参数为符号常量GL_TEXTUREi ,i的取值范围为0~N-1,N是opengl实现支持的最大纹理单元数,这里,因为批处理只有一个纹理,所以textureUnit一直是0,由于使用缓存,只会被调用一次

glBindTexture建立一个绑定到目标纹理的有名称的纹理。比如把一个贴图绑定到一个形状上。

最后调用的绘制函数和上一篇介绍的类似,另外关于shader和混合的问题,将在后面单独开文章介绍

在引擎中使用BatchCommand这个命令的地方有两处ParticleBatchNode和SpriteBatchNode,使用方法很简单。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. _batchCommand.init(  
  2.                        _globalZOrder,  
  3.                        _shaderProgram,  
  4.                        _blendFunc,  
  5.                        _textureAtlas,  
  6.                        transform);  
  7. renderer->addCommand(&_batchCommand);  

需要说明的是,在3.0之后的版本中,由于添加了auto-batch功能,ParticleBatchNode和SpriteBatchNode的节约效率的功能已经不那么明显,但是3.0之前的版本中,把精灵放在SpriteBatchNode父节点上和将粒子系统放在ParticleBatchNode,是能够把相同的精灵批处理,对于相同的贴图只调用一次绘制函数,还是对提升效率很有帮助的。

cocos2dx 游戏源码 cocos2dx 游戏源码 蜗蜗回家 Android ios 可用。。。。。 立即下载

相关推荐

Miniconda3迁移(附图详细过程)

服务器上目录占满,想要将conda迁移到其他目录下的操作方法,详细教程。

2301_77554343的博客 6944

cocos2d-x源码剖析-1-主框架解析

自动生成项目 在vs2017环境下新建项目后,可以在解决资源管理器看到四个文件夹,如下图所示。我们主要关注第一个和第二个文件夹。第一个文件夹展开后是cocs2d为我们自动生成的项目文件,第二个文件夹是cocs2d-x的源码目录,当然这些都是源码路径的链接。现在来看看第一个自动生成的项目文件。 src目录下存储的是头文件以及其实现,在win32文件里面放着项目的主函数。 AppDe...

北顾的博客 1439

从零到一:基于Esp32与LVGL的ST7789屏幕驱动全流程实战

本文详细介绍了基于Esp32与LVGL的ST7789屏幕驱动全流程实战,包括环境准备、驱动文件改造、硬件接口配置、LVGL集成与优化等关键步骤。通过VSCode+ESP-IDF开发环境,读者可以快速掌握SPI模式下的屏幕驱动开发,解决常见问题如颜色错乱、画面撕裂等,并实现LVGL的高效集成与性能优化。

weixin_33725722的博客 711

Cocos2d-x 渲染器Renderer与6种RenderCommand详解

Cocos2d-x 渲染器Renderer 声明:本文使用的是cocos2d-x-3.17的代码 文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy 在《Cocos场景遍历与渲染》中已讲解了Cocos2d 在渲染时会先遍历场景,遍历时会生成渲染命令,渲染器再处理渲染命令绘制出图形。这篇文章主要是讲解渲染器如何处理渲染命令...

Wlk1229 5077

ZEMAX学习第7天-手机镜头光学系统设计全过程案例

接下来对系统微调,依次缩小CRA和畸变,首先对CRA进行依次递减(39°、38°、37°、36°、35°),目前CRA角度40度,每次下降一度进行优化,利用MAXX加OPLT一起控制,控制小于35°。可以看出在标注的三个地方镜头曲率变化,导致PY=1的光线走向奇特,因此需要对矢高进行调整,按照标注的地方依次调整(从右到左)至传函变好,越靠近右边对其余视场影响越小。3.圆锥系数值较大,透镜形状怪异;一、第1,3镜子偏厚,第4镜子偏薄,45镜子间隔边缘偏小,第5片镜子中心厚度与边缘厚度相差较大,需要控制;

liningliwei的博客 1084

图像配准(Image Registration)——深度学习方法

参考:https://www.cnblogs.com/carsonzhu/p/11188574.html

m0_46483236的博客 4万+

ccc坑-xcode下变异出错(出现过两次)

xcode下变异出错(出现过两次) 关键词:Cocos CocosCreator creator2.0报错(网页版模拟器版都没事,ios就报错) JS: Enable batch GL commands optimization! ERROR: TypeError: undefined is not an object (evaluating 't[r][0]'), location: src/project.7d836.js:17:5 STACK: i@src/project.7d836.js:17:5

大短人-技术空间 585

Q&A | ZStack替代VMware实问实答

ZStack替代VMware实问实答

zstack_org的博客 1801

html5看激励视频奖励代码,vivo 的激励视频无法播放 app启动的时候报错

not available(no filename):8 ### App VBuiltIn ### Version: 1.10.3 Build 7/22/2020, 7:50:52 PM(no filename):8 Enable batch GL commands optimization!(no filename):8 running const: 22.53557300567627ms(n...

weixin_42543309的博客 7万+

Zipformer在RK3588上的性能实测:比Conformer快多少?内存省多少?

本文在RK3588平台上对Zipformer和Conformer语音识别模型进行了全面的性能实测。结果显示,Zipformer在模型部署中展现出显著优势:推理速度比Conformer快约56%,峰值内存占用降低约60%,同时在AISHELL-1等测试集上保持了相当的识别准确率。这为边缘ASR应用提供了更高效、更节省资源的解决方案。

metal的博客 484

Linux-ftrace-双nop机制的实现

linux-ftrace内核追踪-双nop机制的实现原理

qq_43707773的博客 1072

[转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

原贴: cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND 上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处理渲染命令BatchCommand,批处理命令的处理在Render中比较简单 1 else if(commandType == RenderCommand::Type:: BATCH_COMM...

weixin_34059951的博客 90

Qualcomm AI Engine Direct SDK(QNN)的使用介绍

Qualcomm AI Engine Direct SDK,高通新的AI模型推理框架,又名QNN,为AI开发提供统一API的底层框架。通过这个SDK,可以在高通的 CPU/GPU和HTP上对AI模型进行性能加速。2.Qualcomm AI Engine Direct SDK的公开英文文档。1.Qualcomm AI Engine Direct SDK的下载和安装。

u013250861的博客 6974

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

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

手机游戏开发学习笔记 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cocos2D-X源码分析之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构

原文地址http://blog.youkuaiyun.com/bill_man         从本篇文章开始,将分析cocos2D-X 3.0源代码,第一部分是从cocos2D-X学习OpenGL,也就是分析cocos2D-X 3.0的渲染代码,本篇首先介绍cocos2D-X 3.0的渲染结构,使用的是3.0正式版。 [cpp] view plaincopy

... 674

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

7.【cocos2d-x 源码分析】:渲染部分的详细分析(中)

对应源码位置:cocos2d-x-3.3\cocos\render* 从RenderCommand看起 class CC_DLL RenderCommand { public: //以下 主要 7种 enum class Type { UNKNOWN_COMMAND,//这一种 就是不知道是哪一种 QUAD_COMMAND, CU...

会飞的徐公明 587

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND

原文:cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND 上一篇文章介绍了cocos2d-x的基本渲染结构,这篇顺着之前的渲染结构介绍渲染命令QUAD_COMMAND命令的部分,通过这部分的函数,学习opengl处理图片渲染的方法,首先介绍这节需要涉及到的基本概念VAO和VBO。 VAO和VBO:     顶点数组对象(Vertex Arr...

weixin_34025151的博客 129

cocos2D-X

cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND 分类: cocos2d2014-07-31 11:18 1410人阅读 评论(4) 收藏 举报         个人原创,欢迎转载,转载请注明原文地址http://blog.youkuaiyun.com/bill_man         上一篇文章介绍了cocos2d-x的基本

linuxheik的专栏 518

cocos2dx android 源码下载,Cocos2dx-Lua - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...

LuaTest2\.cocos-project.jsonLuaTest2\.projectLuaTest2\.settings\version.jsonLuaTest2\cocosstudio\HelloWorld.pngLuaTest2\cocosstudio\MainScene.csdLuaTest2\config.jsonLuaTest2\frameworks\runtime-src\Cla...

weixin_29663061的博客 536

15款Cocos2d-x游戏源码

From: http://blog.okbase.net/iphone/archive/4619.html

Game Developer 6761
上一篇: cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND
下一篇: cocos2dx之实现扑克牌翻转效果的三种方法
箭已离弓
博客等级 码龄14年 37粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值