cocos 图片创建到渲染流程 自述 - pxqwxl/myLearnPoject GitHub Wiki
1 cocos2d 创建精灵
首先通过纹理路径创建一张图片
bool Sprite::initWithFile(const std::string &filename, const Rect& rect) { CCASSERT(filename.size()>0, "Invalid filename");
_fileName = filename;
_fileType = 0;
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);//此处的addimage主要是把文件中的数据根据不同的图片类型转换成texture2d类型的数据结构
if (texture)
{
return initWithTexture(texture, rect);
}
// don't release here.
// when load texture failed, it's better to get a "transparent" sprite then a crashed program
// this->release();
return false;
} addimage 通过路径找到图片 然后读取图标中数据加以区分 例如png jpg等格式进行解析生成textrue2d格式数据
然后调用initWithTexture方法或者setTextures方法对图片进行处理 调用 Director::getInstance()->getTextureCache()->addImage((image, CC_2x2_WHITE_IMAGE_KEY)//(注意此处addimage方法和上方addimage方法不是一个方法 此处addimage有两个参数 )将图片加到textures数组中添加引用计数, 并且调用 glTexImage2D (中间好多次方法调用) 加载纹理
2.当调用mainLoop 方法去遍历并渲染节点时 通过visit方法遍历节点 并调用draw函数调用 _ trianglesCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, _polyInfo.triangles, transform, flags);(此时指令绑定了textrue的名字) 创建渲染指令 render->addCommand()将指令添加到队列 遍历完成 然后调用render方法 for (auto &renderqueue : _renderGroups) { renderqueue.sort(); } 对执行进行排序 随用调用 visitRenderQueue(_renderGroups[0]); 方法遍历每个队列组 进行渲染 glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) );//opengl渲染方法 cmd->useMaterial();//此方法将指令中的texture blend glprogramstate等属性进行绑定 void QuadCommand::useMaterial() const { //Set texture GL::bindTexture2D(_textureID);
//set blend mode
GL::blendFunc(_blendType.src, _blendType.dst);
_glProgramState->applyGLProgram(_mv);
_glProgramState->applyUniforms();
} 完成