cocos2dx::drawNode分析

drawnode整个结构如下:

cocos2dx::drawNode分析_第1张图片

和cocos风格一样,二段式构建方法,create->init,create函数new初始化对象时,初始化如下:


cocos2dx::drawNode分析_第2张图片

初始化vao、vbo,定点相关buffer和脏标记,还有混合模式

看看混合模式的定义:


cocos2dx::drawNode分析_第3张图片

定义了几种混合模式,一般用透明效果参数设置是 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 即上面定义的 ALPHA_NON_PREMULTIPLIED,待会会实验和ALPHA_PREMULTIPLIED的区别(一般是用的预乘混合方式,不预乘的称为straight,主要是在两种颜色缩小可能会出现的不正确的现象)

再看看在init中初始化了什么


cocos2dx::drawNode分析_第4张图片

设置混合模式,设置shader,下面是使用的shader



cocos2dx::drawNode分析_第5张图片


cocos2dx::drawNode分析_第6张图片

3个属性,顶点、纹理坐标和颜色,顶点颜色和纹理坐标两个易变量。

step(edge, x):如果x

对于gl_fragcolor的输出不懂(已解决,纹理坐标长度大于1的step返回0,所以颜色为黑色,纹理坐标小于1的step返回1,所以颜色为采样值),但是点的4个角为什么是透明的,还是不清楚)(原来是返回0的时候会把透明度也设为0!!!而根据混合模式,会把颜色混合为dst的颜色!!!!!!!
)

先分析后面,设置顶点buffer大小

根据平台是否支持开启vao,有些pc不支持,有些android支持得不好,android默认关闭

然后再使用vbo分别绑定顶点坐标,纹理坐标和颜色的值



2、下面开始测试

1> drawDot

画点,提供位置、半径和颜色


cocos2dx::drawNode分析_第7张图片

初始化定点数据,并把数据存在两个三角形结构体中,三角形结构体即3个顶点的结构体,并增加buffer的大小

由此也可知,点是由两个三角形绘制完成,不明白4个圆角如何不显示的(解决)

将此node添加到场景中后,遍历后会调用draw


cocos2dx::drawNode分析_第8张图片

使用的自定义绘制,并设置回调方法为onDraw


cocos2dx::drawNode分析_第9张图片

首先得到shader,使用shader,然后设置内置的uniform

shader在创建的时候会把全部uiform的地址保存在一个数组中,以方便以后的使用,如下:并且会根据是否有某些uiform来设置flag标记,这里需要注意,因为cocos封装了compileshader,使得所有需要的uniform都自动加入shader代码中,但是如果代码中没有使用的uniform,会被自动忽略掉,所以标记会是某些uniform没有。

cocos2dx::drawNode分析_第10张图片

根据uniform的类型给uniform赋值,这里有个疑问,在具体shader中,虽然看到了mvpMatrxi矩阵,但是并没有看到其定义,难道是程序预先在哪里定义了,还是uniform不需要定义?(解决,glprogram中封装了compileshader,使shader字符串加入了一些uniform的定义,如下)


cocos2dx::drawNode分析_第11张图片


cocos2dx::drawNode分析_第12张图片

回到onDraw

然后设置混合,最后就是绑定vbo或者绑定vao,然后绘制即可!


3、drawSegment

相比drawDot,用了8个顶点,组合了6个3角形,不明白为什么要这样做,两个三角形不就行了吗



注意:drawNode支持批绘制,将所有顶点数据都放在buffer中!然后一次绘制,比如


3个图形只调用一次drawcall 实现批绘制

你可能感兴趣的:(cocos2dx::drawNode分析)