CCShaderCache是CCGLProgram的管理类,单例形式。这里备注下代码:
CCShaderCache.cpp NS_CC_BEGIN //==>>cocos2dx自带的几个shader enum { kCCShaderType_PositionTextureColor, kCCShaderType_PositionTextureColorAlphaTest, kCCShaderType_PositionColor, kCCShaderType_PositionTexture, kCCShaderType_PositionTexture_uColor, kCCShaderType_PositionTextureA8Color, kCCShaderType_Position_uColor, kCCShaderType_PositionLengthTexureColor, kCCShaderType_ControlSwitch, kCCShaderType_MAX, }; //单例相关 static CCShaderCache *_sharedShaderCache = 0; 。。。。。 。。。。。 //==>>载入cocos2dx自带的几个shader,并将其放入字典中。 void CCShaderCache::loadDefaultShaders() { // Position Texture Color shader CCGLProgram *p = new CCGLProgram(); loadDefaultShader(p, kCCShaderType_PositionTextureColor); m_pPrograms->setObject(p, kCCShader_PositionTextureColor); p->release(); // Position Texture Color alpha test p = new CCGLProgram(); loadDefaultShader(p, kCCShaderType_PositionTextureColorAlphaTest); m_pPrograms->setObject(p, kCCShader_PositionTextureColorAlphaTest); p->release(); 。。。。。 。。。。。 } //==>>重置shaders,可参考CCGLProgram的reset方法。 void CCShaderCache::reloadDefaultShaders() { // reset all programs and reload them // Position Texture Color shader CCGLProgram *p = programForKey(kCCShader_PositionTextureColor); p->reset(); loadDefaultShader(p, kCCShaderType_PositionTextureColor); // Position Texture Color alpha test p = programForKey(kCCShader_PositionTextureColorAlphaTest); p->reset(); loadDefaultShader(p, kCCShaderType_PositionTextureColorAlphaTest); } //==>>载入cocos2dx自带的shader,根据不同的type,读入不同的shader内容,并且绑定变量。 void CCShaderCache::loadDefaultShader(CCGLProgram *p, int type) { switch (type) { case kCCShaderType_PositionTextureColor: p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionTextureColor_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break; case kCCShaderType_PositionTextureColorAlphaTest: p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionTextureColorAlphaTest_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break; case kCCShaderType_PositionColor: p->initWithVertexShaderByteArray(ccPositionColor_vert ,ccPositionColor_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); break; case kCCShaderType_PositionTexture: p->initWithVertexShaderByteArray(ccPositionTexture_vert ,ccPositionTexture_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break; case kCCShaderType_PositionTexture_uColor: p->initWithVertexShaderByteArray(ccPositionTexture_uColor_vert, ccPositionTexture_uColor_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break; case kCCShaderType_PositionTextureA8Color: p->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, ccPositionTextureA8Color_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break; case kCCShaderType_Position_uColor: p->initWithVertexShaderByteArray(ccPosition_uColor_vert, ccPosition_uColor_frag); p->addAttribute("aVertex", kCCVertexAttrib_Position); break; case kCCShaderType_PositionLengthTexureColor: p->initWithVertexShaderByteArray(ccPositionColorLengthTexture_vert, ccPositionColorLengthTexture_frag); p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); break; case kCCShaderType_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(); } //==>>根据名称获取CCGLProgram CCGLProgram* CCShaderCache::programForKey(const char* key) { return (CCGLProgram*)m_pPrograms->objectForKey(key); } //==>>添加一个program到单例中 void CCShaderCache::addProgram(CCGLProgram* program, const char* key) { m_pPrograms->setObject(program, key); } NS_CC_END
发表评论