【2014-04-03】cocos2dx学习笔记:CCShaderCache

📅 2026/8/19 22:29:42
【2014-04-03】cocos2dx学习笔记:CCShaderCache
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-04-03 标题cocos2dx学习笔记CCShaderCache分类编程 / C C / cocos2dx 标签cocos2dx·CCShaderCachecocos2dx学习笔记CCShaderCacheCCShaderCache是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*_sharedShaderCache0;。。。。。 。。。。。//载入cocos2dx自带的几个shader并将其放入字典中。voidCCShaderCache::loadDefaultShaders(){// Position Texture Color shaderCCGLProgram*pnewCCGLProgram();loadDefaultShader(p,kCCShaderType_PositionTextureColor);m_pPrograms-setObject(p,kCCShader_PositionTextureColor);p-release();// Position Texture Color alpha testpnewCCGLProgram();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*pprogramForKey(kCCShader_PositionTextureColor);p-reset();loadDefaultShader(p,kCCShaderType_PositionTextureColor);// Position Texture Color alpha testpprogramForKey(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