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函数 ........................................................................................ 5 1.3 render对象浅析 .............................................................................................. 5 1.4 AutoBatch原理讲解 ...................................................................................... 9 1.5 自定义RenderCommand.......................................................................... 12
二. OpenGL简介 .................................................................. 13
2.1 OpenGL 渲染管线 ........................................................................................ 13
2.1.1 Vertex Shading ......................................................................... 14 2.1.2 Primitive Assembly ................................................................. 14 2.1.3 Clipping ...................................................................................... 15 2.1.4 Rasterization ............................................................................. 15 2.1.5 fragment shading ................................................................... 16 2.1.6 Pre-Fragment Operations .................................................... 16
2.2 一个简单的着色器程序 ................................................................................ 17 2.3 VAO与VBO ................................................................................................... 20 2.4 彩色的三角形 ................................................................................................. 22 2.5 shader语法简介 ............................................................................................ 24
2.5.1 变量的声明 ................................................................................. 24
2.5.2 变量的转换 ................................................................................. 25 2.5.3 Vector Component Accessors ............................................ 26 2.5.4 shader的结构 ............................................................................ 26 2.5.5shader中的内置变量与内置函数 ............................................ 27 2.5.6 cocos2dx提供的内置变量 ...................................................... 27
三 3D图元的绘制 .................................................................... 29
3.1 MVP 3D 矩阵变幻 ........................................................................................ 29
3.1.1 投影矩阵 ..................................................................................... 30
一. Cocos2dx的渲染流程
要想了解如何在cocos2dx引擎下编写OpenGL代码,首先要知道这些代码应当写在哪里。而cocos2dx这个引擎的渲染模块,正是基于OpenGL的API来编写,我们可以研究一下他的渲染流程。
1.1 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所示。