drawnode整个结构如下:
和cocos风格一样,二段式构建方法,create->init,create函数new初始化对象时,初始化如下:
初始化vao、vbo,定点相关buffer和脏标记,还有混合模式
看看混合模式的定义:
定义了几种混合模式,一般用透明效果参数设置是 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 即上面定义的 ALPHA_NON_PREMULTIPLIED,待会会实验和ALPHA_PREMULTIPLIED的区别(一般是用的预乘混合方式,不预乘的称为straight,主要是在两种颜色缩小可能会出现的不正确的现象)
再看看在init中初始化了什么
设置混合模式,设置shader,下面是使用的shader
3个属性,顶点、纹理坐标和颜色,顶点颜色和纹理坐标两个易变量。
step(edge, x):如果x<edge返回0否则返回1 length()计算向量长度
对于gl_fragcolor的输出不懂(已解决,纹理坐标长度大于1的step返回0,所以颜色为黑色,纹理坐标小于1的step返回1,所以颜色为采样值),但是点的4个角为什么是透明的,还是不清楚)(原来是返回0的时候会把透明度也设为0!!!而根据混合模式,会把颜色混合为dst的颜色!!!!!!!
)
先分析后面,设置顶点buffer大小
根据平台是否支持开启vao,有些pc不支持,有些android支持得不好,android默认关闭
然后再使用vbo分别绑定顶点坐标,纹理坐标和颜色的值
2、下面开始测试
1> drawDot
画点,提供位置、半径和颜色
初始化定点数据,并把数据存在两个三角形结构体中,三角形结构体即3个顶点的结构体,并增加buffer的大小
由此也可知,点是由两个三角形绘制完成,不明白4个圆角如何不显示的(解决)
将此node添加到场景中后,遍历后会调用draw
使用的自定义绘制,并设置回调方法为onDraw
首先得到shader,使用shader,然后设置内置的uniform
shader在创建的时候会把全部uiform的地址保存在一个数组中,以方便以后的使用,如下:并且会根据是否有某些uiform来设置flag标记,这里需要注意,因为cocos封装了compileshader,使得所有需要的uniform都自动加入shader代码中,但是如果代码中没有使用的uniform,会被自动忽略掉,所以标记会是某些uniform没有。
根据uniform的类型给uniform赋值,这里有个疑问,在具体shader中,虽然看到了mvpMatrxi矩阵,但是并没有看到其定义,难道是程序预先在哪里定义了,还是uniform不需要定义?(解决,glprogram中封装了compileshader,使shader字符串加入了一些uniform的定义,如下)
回到onDraw
然后设置混合,最后就是绑定vbo或者绑定vao,然后绘制即可!
3、drawSegment
相比drawDot,用了8个顶点,组合了6个3角形,不明白为什么要这样做,两个三角形不就行了吗
注意:drawNode支持批绘制,将所有顶点数据都放在buffer中!然后一次绘制,比如
3个图形只调用一次drawcall 实现批绘制
网友评论