CCQuadCommand类继承自CCTrianglesCommand类, 因为一个4个点的封闭图形由两个三角形组成.下面先介绍父类CCTrianglesCommand 然后再简单地介绍下CCQuadCommand类 #1. CCTrianglesCommand 三角形图形的渲染指令, vertsNum = 3....... ##1.1 Triangles 结构体

struct Triangles{/**Vertex data pointer.*//** 有时候真的不知道这里面的pointer指的是数据的指针还是属性的位置pointer这里的pointer应该是保存的cpu使用的内存中顶点属性的指针 (x, y, z) (r, g, b, a)(s,t) PS:忘了s, t, r 里的那两个了,反正是纹理坐标里的2个, 这里应该是2D纹理 不考虑第三个轴方向*/V3F_C4B_T2F* verts;/**Index data pointer.*//** 顶点索引的值的数组的指针*/unsigned short* indices;/**The number of vertices.*//** 顶点数, triangle 是3*/int vertCount;/** 一般性和vertCount相同, 但是其实可以重复使用比如(0, 1, 2, 0, 2, 1,.....)*//**The number of indices.*/int indexCount;};
复制代码

这里面除了这个结构体还使用到了前面不曾介绍到的一些类,但是可以简单的介绍下用途, 具体的介绍会放在后面 ##1.2 一些使用到的属性变量

protected:/**Generate the material ID by textureID, glProgramState, and blend function.*/void generateMaterialID();/**Generated material id.*/
/** 就像注释里介绍到的 材质Id是有绑定的纹理ID, 着色程序状态 和混合函数生成的*/uint32_t _materialID;/**OpenGL handle for texture.*/
/** 这个ID是由opengl 管理的纹理单元ID(或者普通纹理缓存对象ID) 纹理单元的数量是有限的具体的数量由各个平台具体的实现决定, opengl es 2.0要求不低于16个*/GLuint _textureID;/**GLprogramstate for the command. encapsulate shaders and uniforms.*/
/** 保存了着色程序的状态和需要用到的统一变量和属性变量*/GLProgramState* _glProgramState;/**Blend function when rendering the triangles.*/
/** 混合函数的类形, 具体的结构会在下面放出*/BlendFunc _blendType;/**Rendered triangles.*/
/** 定义了对应的渲染shader需要使用到的属性的值*/Triangles _triangles;/**Model view matrix when rendering the triangles.*/
/** 模型视图矩阵, 将三角形顶点的opengl世界坐标转移到对应camera的相机坐标系内 再加一个projectionMatrix 就可以获得在可视区域内的坐标*/Mat4 _mv;GLuint _alphaTextureID; // ANDROID ETC1 ALPHA supports.
};
复制代码

###1.2.2BlendFunc BlendFunc 是在ccTypes.h 文件中定义的一个保存了混合函数参数的结构体 决定了新绘制的图形绘制在已有颜色的区域该怎么去混合

/** @struct BlendFunc* Blend Function used for textures.*/
struct CC_DLL BlendFunc
{/** source blend function *//** 类似的像 GL_ONE, GL_ZERO, GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA等等*/GLenum src;/** destination blend function */GLenum dst;/** Blending disabled. Uses {GL_ONE, GL_ZERO} */static const BlendFunc DISABLE;/** Blending enabled for textures with Alpha premultiplied. Uses {GL_ONE, GL_ONE_MINUS_SRC_ALPHA} */static const BlendFunc ALPHA_PREMULTIPLIED;/** Blending enabled for textures with Alpha NON premultiplied. Uses {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA} */static const BlendFunc ALPHA_NON_PREMULTIPLIED;/** Enables Additive blending. Uses {GL_SRC_ALPHA, GL_ONE} */static const BlendFunc ADDITIVE;bool operator==(const BlendFunc &a) const{return src == a.src && dst == a.dst;}bool operator!=(const BlendFunc &a) const{return src != a.src || dst != a.dst;}bool operator<(const BlendFunc &a) const{return src < a.src || (src == a.src && dst < a.dst);}
};
复制代码

##1.3 use方法的实现

void TrianglesCommand::useMaterial() const
{//Set textureGL::bindTexture2D(_textureID);if (_alphaTextureID > 0){ // ANDROID ETC1 ALPHA supports.GL::bindTexture2DN(1, _alphaTextureID);}//set blend modeGL::blendFunc(_blendType.src, _blendType.dst);_glProgramState->apply(_mv);
}
就像我们看到的那样command 只是保存了需要绘制图形的一系列参数,具体的渲染还是要在renderer中进行, 这里的useMaterial实际上是renderer渲染这个图形前使用command带的参数对opengl状态机和缓存进行设置以便运行类似glDrawArray()和glDrawElements()或glDrawInstance() :ps:最后这个不知道opengles2.0有没有
复制代码

##1.4 _materiaId实质上是一个hash 32值 不多说贴代码

void TrianglesCommand::generateMaterialID()
{// glProgramState is hashed because it contains://  *  uniforms/values//  *  glProgram//// we safely can when the same glProgramState is being used then they share those states// if they don't have the same glProgramState, they might still have the same// uniforms/values and glProgram, but it would be too expensive to check the uniforms.struct {GLuint textureId;GLenum blendSrc;GLenum blendDst;void* glProgramState;} hashMe;hashMe.textureId = _textureID;hashMe.blendSrc = _blendType.src;hashMe.blendDst = _blendType.dst;hashMe.glProgramState = _glProgramState;_materialID = XXH32((const void*)&hashMe, sizeof(hashMe), 0);
}
复制代码

后面的文章应该会先介绍 CCGLProgramState类 然后接着介绍使用最多的QuadCommand类

转载于:https://juejin.im/post/5a30dd466fb9a0450f21ede2

Cocos2dx源码记录(6) CCTrianglesCommand相关推荐

  1. Cocos2dx源码记录(1) CCGLProgram

    前言: 这个系列是我自己在看cocos2dx源码时记录的一些比较重要的数据结构跟方法中间可能穿插些opengl的知识. 每个介绍的类之间没有固定引用顺序,仅作为个人的记录,可能会有点乱(其实主要是为了 ...

  2. Cocos2dx源码记录(11) CCPrimtiveCommand,CCPrimetive

    #1 CCPrimetive 因为CCPrimtiveCommand里有用到这个就先分析下这个吧 按照字面的意思应该是由一系列顶点属性和带有顺序的顶点索引的图元面片类 /**Primitive can ...

  3. Gem5模拟器,popnet模拟器源码记录(十五)

    在使用王小航老师课题组开源的Gem5代码进行大规模的Chiplet并行仿真时,有个关键问题是:为什么原来的gem5不可以进行大规模仿真?为什么精度不够?也是论文提出的背景: (20条消息) 傻白探索C ...

  4. 学习vue-router源码记录-1

    因为本人开发中使用的是VUE技术栈,最近也是开始源码的学习,以此记录个人理解,若行文有误,请多多指教. 1.new Router和install 在vue中我们使用vue-router时需要先进行ne ...

  5. Ubuntu16.04编译android6.0.1源码记录

    目录 目录 一.安装环境 二.下载源码 1.下载repo 2.初始化repo 3.同步源代码 关于驱动 三.编译源码 四.导入源码到AS 五.刷入真机 六.修改源码 总结: 3.同步源代码 关于驱动 ...

  6. 【GAT】图注意力网络 - 简单的源码记录

    由于和GCN代码比较相似,所以部分内容从GCN那篇博客中截取. 1 - cora数据集 GNN常用数据集之Cora数据集 2 - 源码含义记录 首先我们来整体看一下代码的组成 截图中的这一大坨为命令行 ...

  7. 安卓贴图源码---记录旋转后位置..类似in/百度魔图

    效果如图: 类似in,百度魔图,的贴图功能  核心的地方:单/多点 旋转缩放后记录各个顶点小图标位置 引用这里 http://blog.csdn.net/xiaanming/article/detai ...

  8. 远古守卫/cocos2d-x 源码/塔防游戏/高仿王国保卫战

    下载地址:下载地址 本源码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程网站raywenderlich内部工程师制作,有非常完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔 ...

  9. windows编译安卓源码记录

    环境 Windows10 + vmware17 + ubuntu22 ubuntu环境设置 装完ubuntu系统后拖拽复制文件进去验证vmtools功能情况,如果vmtools异常很麻烦,试了n多方法 ...

最新文章

  1. 以下一些使用ASP.NET和VISUAL STUDIO.NET2003的经验和技巧
  2. 配置Docker代理已实现外网访问
  3. 一、搭建Python环境和安装Pycharm
  4. 纯原生仿ES6的Object.assign,实现深度合并对象
  5. flash在影片剪辑里面跳转场景
  6. Jmeter日志输出和日志级别设置
  7. jq之text() html()
  8. Skype for Business Server 2019 本地部署
  9. linux下定时执行任务方法【转】
  10. Debian - NFS搭建 + 测试
  11. 读“我为什么不要应届毕业生”
  12. Layer/jquery获取父窗口的元素
  13. 计算机考研复试问题回答,关于考研复试问题的官方解答及部分问题答题模板!...
  14. 宇视摄像头IP地址修改工具
  15. steam 经典 android,游戏玩家必备 Android版Steam试用
  16. AMR音频文件格式分析
  17. mongodb与mysql相比的优缺点
  18. Java语言HttpClient使用代理IP
  19. 计算机经常自动关机怎么回事,教你电脑总是自动关机怎么办
  20. 免费开放可转盲文字库 阿里健康大药房呼吁关注视障群体用药安全

热门文章

  1. 如何在firefox下获取下列框选中option的text
  2. Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)
  3. python真的那么火还是炒作_Python语言为什么会这么火?老男孩python
  4. 电脑控制手机屏幕软件_手机屏幕如何投屏到电脑
  5. jupyter notebook 安装教程
  6. [Ext JS6]Microloader - 微加载器
  7. java 静态方法_自学JAVA每日记录(11)-欢迎指点欢迎共勉
  8. intellij快捷键linux,IntelliJ IDEA的几个常用快捷键
  9. CodeForces - 589D
  10. 导出标签_如何从系统导出审计要求的日记账