void ShaderNode::loadShaderVertex(const char *vert, const char *frag) { CCGLProgram* shader = new CCGLProgram(); shader->initWithVertexShaderFilename(vert, frag); //载入着色器程序 //绑定attribute变量 shader->addAttribute("a_position", 0); shader->addAttribute("a_color", 1); shader->link(); //获取attribute变量标识 m_attributeColor = glGetAttribLocation(shader->getProgram(), "a_color"); m_attributePosition = glGetAttribLocation( shader->getProgram(), "a_position"); shader->updateUniforms(); //获取uniform变量标识 m_uniformResolution = glGetUniformLocation(shader->getProgram(), "resolution"); m_uniformTime = glGetUniformLocation(shader->getProgram(), "time"); m_uniformTex0 = glGetUniformLocation(shader->getProgram(), "tex0"); //使用着色器程序 this->setShaderProgram(shader); shader->release(); }
static int tolua_CCGLProgram_CCGLProgram_getProgram00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertype(tolua_S,1,"CCGLProgram",0,&tolua_err) || !tolua_isnoobj(tolua_S,2,&tolua_err) ) goto tolua_lerror; else #endif { CCGLProgram* self = (CCGLProgram*) tolua_tousertype(tolua_S,1,0); #ifndef TOLUA_RELEASE if (!self) tolua_error(tolua_S,"invalid 'self' in function 'getProgram'", NULL); #endif { unsigned const int tolua_ret = ( unsigned const int) self->getProgram(); tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'getProgram'.",&tolua_err); return 0; #endif }
void ShaderNode::loadShaderVertex(const char *vert, const char *frag) { CCGLProgram *shader = new CCGLProgram(); shader->initWithVertexShaderFilename(vert, frag); shader->addAttribute("aVertex", kCCVertexAttrib_Position); shader->link(); shader->updateUniforms(); m_uniformCenter = glGetUniformLocation(shader->getProgram(), "center"); m_uniformResolution = glGetUniformLocation(shader->getProgram(), "resolution"); m_uniformTime = glGetUniformLocation(shader->getProgram(), "time"); this->setShaderProgram(shader); shader->release(); }
bool TextureSprite::init(std::string &texFileName, CCPointVector &vertices) { /// Load the texture from file if (texFileName.length() == 0) { CCLOGERROR("Invalid texture filename (empty string)"); return false; } CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(texFileName.c_str()); if (!texture) { CCLOGERROR("ERROR: Can't load texture: '%s'", texFileName.c_str()); return false; } setTexture(texture); /// Enable texture repeat. Horizontal and vertical repeat enabled by default. setRepeat(true, true); /// Create the shader program CCGLProgram *shader = CCShaderCache::sharedShaderCache()->programForKey(settings::kShader_PositionTexture_uColor_uTime); mColorLocation = glGetUniformLocation(shader->getProgram(), "u_color"); mTimeLocation = glGetUniformLocation(shader->getProgram(), "u_time"); setShaderProgram(shader); addPolygon(vertices); /* Seems that there's no need to call the init method again when the app is back to foreground (like CCDrawNode.cpp). * Only reload shaders is mandatory (see proj.android/jni/hellolua/main.cpp). */ /* #if CC_ENABLE_CACHE_TEXTURE_DATA > 0 CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(TextureSprite::listenBackToForeground), EVENT_COME_TO_FOREGROUND, NULL); #endif */ return true; }
void RawStencilBufferTest4::setupStencilForClippingOnPlane(GLint plane) { RawStencilBufferTest::setupStencilForClippingOnPlane(plane); glDepthMask(GL_FALSE); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, _alphaThreshold); #else CCGLProgram *program = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColorAlphaTest); GLint alphaValueLocation = glGetUniformLocation(program->getProgram(), kCCUniformAlphaTestValue); program->setUniformLocationWith1f(alphaValueLocation, _alphaThreshold); m_pSprite->setShaderProgram(program ); #endif }
void oc_reset_cc_gl_state(){ //reset to cocos2d-x render state static GLuint s_cc_gl_program = 0; static CCDirector* s_cc_director = NULL; if( 0 == s_cc_gl_program ){ CCShaderCache* cache = CCShaderCache::sharedShaderCache(); CCGLProgram* glp = cache->programForKey(kCCShader_PositionTextureColor); s_cc_gl_program = glp->getProgram(); } if( NULL == s_cc_director ){ s_cc_director = CCDirector::sharedDirector(); } glUseProgram(s_cc_gl_program); s_cc_director->setAlphaBlending(true); s_cc_director->setDepthTest(false); s_cc_director->setProjection(kCCDirectorProjection3D); // glDisable( GL_CULL_FACE ); }
void BatchNodeManager::setBatchNodeAlphaTestValue(float _value) { CCGLProgram* alphashader = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColorAlphaTest); CHECK_GL_ERROR_DEBUG(); alphashader->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionTextureColorAlphaTest_frag); alphashader->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); alphashader->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); alphashader->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); alphashader->link(); alphashader->updateUniforms(); unsigned loc = glGetUniformLocation(alphashader->getProgram(), kCCUniformAlphaTestValue); CHECK_GL_ERROR_DEBUG(); alphashader->setUniformLocationWith1f(loc, _value); CHECK_GL_ERROR_DEBUG(); }
void RawStencilBufferTest6::setupStencilForClippingOnPlane(GLint plane) { GLint planeMask = 0x1 << plane; glStencilMask(planeMask); glStencilFunc(GL_NEVER, 0, planeMask); glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); ccDrawSolidRect(CCPointZero, ccpFromSize(CCDirector::sharedDirector()->getWinSize()), ccc4f(1, 1, 1, 1)); glStencilFunc(GL_NEVER, planeMask, planeMask); glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, _alphaThreshold); #else CCGLProgram *program = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColorAlphaTest); GLint alphaValueLocation = glGetUniformLocation(program->getProgram(), kCCUniformAlphaTestValue); program->setUniformLocationWith1f(alphaValueLocation, _alphaThreshold); m_pSprite->setShaderProgram(program); #endif glFlush(); }
bool SceneNode::initWithTexture(std::string textureName) { //enable touch setTouchEnabled( true ); //set projection is 2D (default is 3D). if use 3D projection, projection error accumulation may cause ripple effect mess. CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D); //get adaptedViewport. adaptedViewport is calculated by cocos2d-x //so long as we use this adaptedViewport, we just writting code based on designResolutionSize, no need to worry about the screen adaptation. glGetIntegerv(GL_VIEWPORT,adaptedViewport); //get screenSize //screenSize is the real size of simulator/device screen screenSize=CCEGLView::sharedOpenGLView()->getFrameSize(); CCLOG("screenSize:%f,%f",screenSize.width,screenSize.height); //get winSize //winSize is equals to designResolutionSize. we only need to writting code based on designResolutionSize (and forget the real screenSize). winSize=CCDirector::sharedDirector()->getWinSize(); CCLOG("winSize:%f,%f",winSize.width,winSize.height); //determine bufferTexSize based on winSize bufferTexSize=CCSize(winSize.width*0.4,winSize.height*0.4); //use bufferTexSize to calculate step_s and step_t step_s=1.0/bufferTexSize.width; step_t=1.0/bufferTexSize.height; //create textures texBackGround = CCTextureCache::sharedTextureCache()->addImage(textureName.c_str()) ; bufferTexSource=createCCTexture2DWithSize(bufferTexSize,kCCTexture2DPixelFormat_RGBA8888,0.5,0.5,0.5,1); bufferTexDest=createCCTexture2DWithSize(bufferTexSize,kCCTexture2DPixelFormat_RGBA8888,0.5,0.5,0.5,1); bufferTexTemp=createCCTexture2DWithSize(bufferTexSize,kCCTexture2DPixelFormat_RGBA8888,0.5,0.5,0.5,1); //set texture params ccGLBindTexture2D(bufferTexSource->getName()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//GL_NEAREST glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//GL_NEAREST glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ccGLBindTexture2D(bufferTexDest->getName()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ccGLBindTexture2D(bufferTexTemp->getName()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //create shaders //updateRipple shader { GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("updateRipple.fsh").c_str())->getCString(); CCGLProgram* pProgram = new CCGLProgram(); pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, fragSource); //bind attribute pProgram->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); pProgram->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); pProgram->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); //link (must after bindAttribute) pProgram->link(); //get cocos2d-x build-in uniforms pProgram->updateUniforms(); //get my own uniforms map<string,GLint> myUnifoMap; myUnifoMap["texSource"] =glGetUniformLocation(pProgram->getProgram(),"texSource"); myUnifoMap["texDest"] = glGetUniformLocation(pProgram->getProgram(),"texDest"); myUnifoMap["step_s"] = glGetUniformLocation(pProgram->getProgram(),"step_s"); myUnifoMap["step_t"] = glGetUniformLocation(pProgram->getProgram(),"step_t"); myUnifoMap["touchPos_winSpace"] = glGetUniformLocation(pProgram->getProgram(),"touchPos_winSpace"); myUnifoMap["touchValid"] = glGetUniformLocation(pProgram->getProgram(),"touchValid"); myUnifoMap["winSize"] = glGetUniformLocation(pProgram->getProgram(),"winSize"); myUnifoMap["bufferTexSize"] = glGetUniformLocation(pProgram->getProgram(),"bufferTexSize"); //make program_updateRipple program_updateRipple.myUnifoMap=myUnifoMap; program_updateRipple.setProgram(pProgram); //program can be released pProgram->release(); //check gl error CHECK_GL_ERROR_DEBUG(); } //renderRipple shader { GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("renderRipple.fsh").c_str())->getCString(); CCGLProgram* pProgram = new CCGLProgram(); pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, fragSource); //bind attribute pProgram->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position); pProgram->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color); pProgram->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); //link (must after bindAttribute) pProgram->link(); //get cocos2d-x build-in uniforms pProgram->updateUniforms(); //get my own uniforms map<string,GLint> myUnifoMap; myUnifoMap["texSource"] = glGetUniformLocation(pProgram->getProgram(),"texSource"); myUnifoMap["step_s"] = glGetUniformLocation(pProgram->getProgram(),"step_s"); myUnifoMap["step_t"] = glGetUniformLocation(pProgram->getProgram(),"step_t"); //make program_renderRipple program_renderRipple.myUnifoMap=myUnifoMap; program_renderRipple.setProgram(pProgram); //program can be released pProgram->release(); //check gl error CHECK_GL_ERROR_DEBUG(); } //create FBO glGenFramebuffers(1,&hFBO); // create model float posArray[8]={0,0,winSize.width,0,winSize.width,winSize.height,0,winSize.height}; int indexArray[6]={0,1,2,2,3,0}; float texCoordArray[8]={0,1,1,1,1,0,0,0}; //create indexVBO CindexVBO::enableAttribArrays(); _indexVBO=new CindexVBO(); _indexVBO->genBuffers(); //submit data to VBO _indexVBO->submitPos(posArray,8,GL_STATIC_DRAW); _indexVBO->submitIndex(indexArray,6,GL_STATIC_DRAW); _indexVBO->submitTexCoord(texCoordArray,8,GL_STATIC_DRAW); //check gl error CHECK_GL_ERROR_DEBUG(); return true ; }