[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-04-03| 标题:cocos2dx学习笔记:CCShaderCache|分类:编程 / C && C++ / cocos2dx |标签:cocos2dx·CCShaderCache
cocos2dx学习笔记:CCShaderCache
CCShaderCache是CCGLProgram的管理类,单例形式。这里备注下代码:
CCShaderCache.cpp NS_CC_BEGIN//==>>cocos2dx自带的几个shaderenum{kCCShaderType_PositionTextureColor,kCCShaderType_PositionTextureColorAlphaTest,kCCShaderType_PositionColor,kCCShaderType_PositionTexture,kCCShaderType_PositionTexture_uColor,kCCShaderType_PositionTextureA8Color,kCCShaderType_Position_uColor,kCCShaderType_PositionLengthTexureColor,kCCShaderType_ControlSwitch,kCCShaderType_MAX,};//单例相关staticCCShaderCache*_sharedShaderCache=0;。。。。。 。。。。。//==>>载入cocos2dx自带的几个shader,并将其放入字典中。voidCCShaderCache::loadDefaultShaders(){// Position Texture Color shaderCCGLProgram*p=newCCGLProgram();loadDefaultShader(p,kCCShaderType_PositionTextureColor);m_pPrograms->setObject(p,kCCShader_PositionTextureColor);p->release();// Position Texture Color alpha testp=newCCGLProgram();loadDefaultShader(p,kCCShaderType_PositionTextureColorAlphaTest);m_pPrograms->setObject(p,kCCShader_PositionTextureColorAlphaTest);p->release();。。。。。 。。。。。}//==>>重置shaders,可参考CCGLProgram的reset方法。voidCCShaderCache::reloadDefaultShaders(){// reset all programs and reload them// Position Texture Color shaderCCGLProgram*p=programForKey(kCCShader_PositionTextureColor);p->reset();loadDefaultShader(p,kCCShaderType_PositionTextureColor);// Position Texture Color alpha testp=programForKey(kCCShader_PositionTextureColorAlphaTest);p->reset();loadDefaultShader(p,kCCShaderType_PositionTextureColorAlphaTest);}//==>>载入cocos2dx自带的shader,根据不同的type,读入不同的shader内容,并且绑定变量。voidCCShaderCache::loadDefaultShader(CCGLProgram*p,inttype){switch(type){casekCCShaderType_PositionTextureColor:p->initWithVertexShaderByteArray(ccPositionTextureColor_vert,ccPositionTextureColor_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;casekCCShaderType_PositionTextureColorAlphaTest:p->initWithVertexShaderByteArray(ccPositionTextureColor_vert,ccPositionTextureColorAlphaTest_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;casekCCShaderType_PositionColor:p->initWithVertexShaderByteArray(ccPositionColor_vert,ccPositionColor_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);break;casekCCShaderType_PositionTexture:p->initWithVertexShaderByteArray(ccPositionTexture_vert,ccPositionTexture_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;casekCCShaderType_PositionTexture_uColor:p->initWithVertexShaderByteArray(ccPositionTexture_uColor_vert,ccPositionTexture_uColor_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;casekCCShaderType_PositionTextureA8Color:p->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert,ccPositionTextureA8Color_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;casekCCShaderType_Position_uColor:p->initWithVertexShaderByteArray(ccPosition_uColor_vert,ccPosition_uColor_frag);p->addAttribute("aVertex",kCCVertexAttrib_Position);break;casekCCShaderType_PositionLengthTexureColor:p->initWithVertexShaderByteArray(ccPositionColorLengthTexture_vert,ccPositionColorLengthTexture_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);break;casekCCShaderType_ControlSwitch:p->initWithVertexShaderByteArray(ccPositionTextureColor_vert,ccExSwitchMask_frag);p->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);break;default:CCLOG("cocos2d: %s:%d, error shader type",__FUNCTION__,__LINE__);return;}//==>>连接program,更新常量值p->link();p->updateUniforms();CHECK_GL_ERROR_DEBUG();}//==>>根据名称获取CCGLProgramCCGLProgram*CCShaderCache::programForKey(constchar*key){return(CCGLProgram*)m_pPrograms->objectForKey(key);}//==>>添加一个program到单例中voidCCShaderCache::addProgram(CCGLProgram*program,constchar*key){m_pPrograms->setObject(program,key);}NS_CC_END