- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
cocos2dx下的OpenGL学习总结docx
Objective:
1、了解cocos2dx渲染流程,学习如何在cocos2dx引擎下编写OpenGL代码
2、了解OpenGL的渲染管线,学习Vertex shader和Fragment shader的编写,学习shader与c++程序如何传做数据传递
作者:织法
在手游如雨后春笋般上线的今天,手游的同质化极其严重。不同游戏间差别可能只是一层皮,在这种情况下,一款游戏若想获得成功,就必须有所突破,图形就是一个很好的突破口。
在中国,Cocos2dx是当下最流行的2D手游开发引擎,其最大的优点之一就是开源。正因为这一特点,我们可以轻松的添加一些自己想要的效果,尤其在图形方面。
下面,我将讲解如何在cocos2dx下使用OpenGL。
目录
一. Cocos2dx的渲染流程 3
1.1 Node的Visite函数 3
1.2 Sprite的draw函数 6
1.3 render对象浅析 6
1.4 AutoBatch原理讲解 10
1.5 自定义RenderCommand 13
二. OpenGL简介 14
2.1 OpenGL 渲染管线 14
2.1.1 Vertex Shading 15
2.1.2 Primitive Assembly 15
2.1.3 Clipping 16
2.1.4 Rasterization 16
2.1.5 fragment shading 17
2.1.6 Pre-Fragment Operations 17
2.2 一个简单的着色器程序 18
2.3 VAO与VBO 21
2.4 彩色的三角形 23
2.5 shader语法简介 25
2.5.1 变量的声明 25
2.5.2 变量的转换 26
2.5.3 Vector Component Accessors 27
2.5.4 shader的结构 27
2.5.5shader中的内置变量与内置函数 28
2.5.6 cocos2dx提供的内置变量 28
三 3D图元的绘制 30
3.1 MVP 3D 矩阵变幻 30
3.1.1 投影矩阵 31
Cocos2dx的渲染流程
要想了解如何在cocos2dx引擎下编写OpenGL代码,首先要知道这些代码应当写在哪里。而cocos2dx这个引擎的渲染模块,正是基于OpenGL的API来编写,我们可以研究一下他的渲染流程。
Node的Visite函数
打开cocos2dx引擎中的CCNode.cpp文件,翻到Visit处,可看到以下代码,如图1.1所示。
图1.1 Visit
Node的Visite先从导演类中取得渲染器Render对象,在从矩阵栈中获取当前的modelView矩阵。再把他们传入带3个参数的Visit中。下面我们看看这个函数都做了些什么,如图1.2,1.3所示
图1.2 visit1
图1.3 visit2
我们可以看到,当visible为false时,函数直接被return掉。之后先向栈中推入一个矩阵,在把当前的modelView矩阵放入栈中。而后就是我们熟悉的遍历过程。先遍历Z-order小于0的,绘制,而后是大于0的。这也就揭示了zorder是如何控制渲染层级的,也揭示节点树的绘制顺序。
1.2 Sprite的draw函数
下面,我们看一下精灵类draw到底做了些什么。打开引擎的CCSprite.cpp文件,翻到draw处,其代码如图1.4所示。
图1.4 Sprite::draw
我们可以看到,传说中的渲染剔除,就是在这里做的。而且就是一个AABB的判断。这函数的主要功能,就是把相关信息放入一个command中,传到了render对象中。
1.3 render对象浅析
下面,我们将详细分析下这个render对象。
首先,我们找6张可爱的水果图片,在helloworld中重复添加这些图片,运行效果如图1.5所示。
图1.5 小水果
在Renderer的render函数中打上断点,如图1.6所示。
图1.6 render函数
在Renderer的render函数中打上断点,如图1.6所示。我们查看调用堆栈的上一级,可以看到我们的大导演在每帧的循环中做了这些事情。如图1.7,1.8,1.9所示。首先更新scheduler,而后让当前的场景visit(所有节点draw函数就在这里调用的),最后调用render,推出当前矩阵,交换背缓冲。
图1.7 大导演的drawScene (1)
图1.8 大导演的drawScene (2)
图1.6 大导演的drawScene (3)
而后我们再回到render的函数中,看一下他的visitRenderQueue函数,如图1.7,1.8所示。我们首先看最常用的
文档评论(0)