版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
#前言
本文总结了如何借助CCGLProgram来实现自定义绘制的节点类,使用自定义的顶点着色器和片段着色器,实现一个绘制彩色矩形的节点类。
绘制的效果图如下所示:
思路及实现
思路
目标是:实现一个可绘制对象A,绘制出一个彩色的矩形。
首先, 要能实现绘制,那么A就要能够加入到节点树之中,这样引擎在遍历节点树进行绘制的时候,它才能够被绘制出来。怎样才能被加入到节点树?成为Node的子类, 然后addChild即可。
其次,要实现自定义绘制,就要重写Node::draw()方法,并且在draw调用之前,创建好顶点shader和片段shader,以及准备好shader program, 完成shader中变量的绑定和值传递。
思路清楚后,开始写代码。
实现 第1步: 自定义节点类CustomDrawNode继承自CCNode
CustomDrawNode作为一个自定义绘制节点类的父类的角色,具体的自定义绘制类继承CustomDrawNode. 它定义了绘制逻辑的骨架,具体的绘制操作延迟到不同的子类来完成,可以扩展出各种绘制操作,恩,这是模板方法设计模式的思路。
CustomDrawNode的创建通过指定一对着色器文件名,内部使用CCGLProgram来创建着色器程序
CustomDrawNode预留模板方法接口,让具体的子类来控制着色器程序的变量绑定及传值
实现 第2步: 定义绘制矩形类CustomRectangleNode继承CustomDrawNode
下面就开始定义要绘制的矩形类了,定义一个类叫CustomRectangleNode,它继承CustomDrawNode,并且根据自己使用的shader来实现父类预留的模板方法接口。
CustomRectangleNode的具体实现取决于其使用的shader,因此首先要确定shader。因为我只想绘制一个彩色的矩形,shader很简单:
顶点着色器
片段着色器
顶点shader中定义了一个attribute, 片段shader中定义了一个uniform,这些对于了解绘制过程足够了。下面是CustomRectangleNode的实现:
好了,CustomRectangleNode定义完成了,
CustomRectangleNode重写了父类定义的模板方法customSetupBeforeLink(), 在其中中绑定了顶点着色器中的attribute: custom_a_position
,
CustomRectangleNode重写了父类定义的模板方法updateCustomUniforms,在其中绑定了片段着色器中的uniform:custom_u_color
, 并且给其赋值一个随机的颜色向量。
CustomRectangleNode重写了Node的draw()方法, 定义了顶点数组,并且把数组传给顶点shader中的custom_a_position
,最终实现了矩形的绘制。
下面是测试代码:
创建一个CustomRectangleNode, 并且把它addChild()到节点树即可。
源码
CustomDrawNodePage.h
CustomDrawNodePage.cpp
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问