u单纯使用OPENGl写一个场景渲染时,可以很容易的看出OEPNGL整个渲染流程,cocos引擎将整个渲染流程进行了封装分类,各司其职。虽然很多人说cocos渲染底层是学生写的,不少问题,然而cocos这个小巧的引擎,确是一个很好的学习引擎渲染架构的方式,本篇主要讲,引擎底层怎么组织shader,读取模型,材质,创建生成渲染指令的过程进行剖析,本章记录内置shader的构建过程。
内置shader和材质构建:
首先,程序创建scene后,会创建一个默认相机,相机创建过程中,会创建一个CameraBackgroundBrush,用于刷黑屏幕,代码如下:
Camera::Camera()
{
_clearBrush = CameraBackgroundBrush::createDepthBrush(1.f);
_clearBrush->retain();
}
CameraBackgroundBrush创建过程会调用下面的函数:
bool CameraBackgroundDepthBrush::init()
{
//获取擦除相机的shader
auto shader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_CAMERA_CLEAR);
//创建ProgramState,具体而言就是材质,shader的具体化
_glProgramState = GLProgramState::getOrCreateWithGLProgram(shader);
_glProgramState->retain();
。。。。。。。
//绘制矩形背景
。。。。。。。。
return true;
}
其中,程序CameraBackgroundBrush初始过程中会调用GLProgramCache::getInstance(),如果GLProgramCache( 内置shader的集合)不存在,就创建,并返回,单例模式,运行过程中只有一个。
GLProgramCache* GLProgramCache::getInstance()
{
if (!_sharedGLProgramCache) {
_sharedGLProgramCache = new (std::nothrow) GLProgramCache();
if (!_sharedGLProgramCache->init())
{
CC_SAFE_DELETE(_sharedGLProgramCache);
}
}
return _sharedGLProgramCache;
}
GLProgramCache的初始化函数如下: