-
说明:
- 1、以前学习过Android UI 布局
- 2、使用Java编写过动画效果demo
- 学习之前:我之前简单的认为,场景、层、精灵在图画绘制的关系就是由大到小的包含布局关系,并没有深入地了解这三者从无到有的绘制过程。
- 学习目的:理解cocos2d-x如何使用OpenGL来渲染成像的。
参考博客:
OpenGL–3D世界(视图变换,模型变换,投影变换,视口变换)
http://blog.youkuaiyun.com/u010223072/article/details/44620871
OpenGL 的渲染流水线
http://blog.youkuaiyun.com/pizi0475/article/details/50605972
Cocos场景遍历与渲染
http://blog.youkuaiyun.com/wlk1229/article/details/55005282
渲染流水线
http://www.cnblogs.com/suimeng/p/4655834.html
cocos2dx的渲染机制
http://blog.youkuaiyun.com/han1558249222/article/details/48093931
贴图、纹理、材质的区别
https://www.zhihu.com/question/25745472/answer/31462038
cocos2d-x3.2渲染机制的优化
http://blog.youkuaiyun.com/mydreamremindme/article/details/47091601
浅谈Draw Call和Batch的区别
http://blog.youkuaiyun.com/molti/article/details/42495993
参考书籍:《Cocos2d-x高级开发教程》
基础知识:
1、导演director、场景scene、层layer、精灵sprite 的基本概念和继承关系树。
http://www.cocos.com/docs/native/
2、世界坐标系、绘图坐标系、模型坐标系。
说说我现在的理解,世界坐标系是不动的,在cocos2d-x里面,世界坐标系的原点是在可视屏幕的左下角,x轴往右,Y轴往上。绘图坐标系顾名思义,是OpenGL绘制图形的时候使用的坐标系,cocos2d-x也参照了OpenGL,套用上了这个绘图坐标系,在没有设计任何坐标变换时(绘图坐标系具有可变性),绘图坐标系和世界坐标系的原点相同。模型坐标系,模型坐标系就是以纹理自身的锚点作为坐标系的原点,X轴和Y轴方向与世界坐标系相同。
3、坐标系变换及坐标系变换矩阵。
坐标系的变换,主要的关键再与绘图坐标系与世界坐标系的关系。前面说到绘图坐标系是具备可变性的,它的原点和X轴Y轴的方向是可变,但纹理在绘图坐标系中的坐标是不会改变的。比如绘制一个精灵,通过平移200PX,那么就会通过当前绘图坐标系原点所在的世界坐标系的值,通过平移矩阵的变换,得到绘图坐标系原点新的世界坐标系的值,然后再绘制这个精灵。变换矩阵通过《Cocos2d-x高级开发教程》中学习。
4、节点层级
节点是场景、层和精灵共同的父类,在这里将它们统称节点。我把节点分为组合节点和独立节点。组合节点由“自身节点+组合节点or独立节点”构成,是一个树的结构。
从生活体验可以知道,画家在绘制同一幅画时,都是有先后顺序的,OpenGL的绘制也是如此。这个优先顺序称为节点层级。在组合节点的子节点中,节点层级通过三个值globalZOrder、localZOrder、orderOfArrival 进行比较,都是值越大越靠前。三个值的对层级影响的优先顺序为globalZOrder、localZOrder、orderOfArrival。当globalZOrder的值大时,则会忽略localZOrder和orderOfArrival,globalZOrder值大则排在前面。我们发现了一个词叫ZOrder,Z轴坐标,由于OpenGL绘制成像是有过程的,cocos2d-x中,通过提供ZOrder属性,来对图形的绘制顺序形象立体化,来应对组合节点的绘制过程以及图像的重叠等问题。
orderOfArrival
orderOfArrival是节点添加到父节点时会被设置,
child->setOrderOfArrival(s_globalOrderOfArrival++)。
所有节点的orderOfArriva都是通过 s_ globalOrderOfArrival值累加得到的。s_ globalOrderOfArrival是Node节点的一个静态变量,初始值为1。
int Node::s_globalOrderOfArrival = 1;
每次有调用addChild函数,则该值会加1,所以所有节点的该值都不一样。
localZOrder
localZOrder在节点的构造函数中设置为0,默认值为0。可以通过函数