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 ); }
bool YUVSprite::initWidthYUV420P(int w,int h,uint8_t *yuv[3],int linesize[3]) { /* 初始化shader program */ //double t0 = cc_clock(); CCShaderCache * ccsc = CCShaderCache::sharedShaderCache(); while(1){ if(ccsc){ _prog = ccsc->programForKey(_yuv420pShaderName); if(!_prog){ _prog = new CCGLProgram(); if(_prog && _prog->initWithVertexShaderByteArray(_vshader,_fshader) ){ //add attribute _prog->addAttribute("position", ATTRIB_VERTEX); _prog->addAttribute("TexCoordIn", ATTRIB_TEXTURE); if(_prog->link()){ _prog->updateUniforms(); ccsc->addProgram(_prog, _yuv420pShaderName); _prog->release(); CHECK_GL_ERROR_DEBUG(); break; }else{ CCLOG("yuv420p shader program link failed"); } }else{ CCLOG("yuv420p shader program compile failed"); } }else break; } CCLOG("YUVSprite::initWidthYUV420P yuv420p shader program init failed"); return false; } //double t1 = cc_clock(); /* 加载texture */ if(CCSprite::init()){ if(yuv){ _width = w; _height = h; setContentSize(CCSize(w,h)); CCRect rect = CCRectZero; rect.size = CCSize(w,h); setTextureRect(rect,false,rect.size); textureUniformY = glGetUniformLocation(_prog->getProgram(), "tex_y"); textureUniformU = glGetUniformLocation(_prog->getProgram(), "tex_u"); textureUniformV = glGetUniformLocation(_prog->getProgram(), "tex_v"); borderUniformY = glGetUniformLocation(_prog->getProgram(), "yborder"); borderUniformU = glGetUniformLocation(_prog->getProgram(), "uborder"); borderUniformV = glGetUniformLocation(_prog->getProgram(), "vborder"); _border[0] = (float)w/(float)linesize[0]; _border[1] = (float)w/(2.0f*linesize[1]); _border[2] = (float)w/(2.0f*linesize[2]); // double t2 = cc_clock(); glGenTextures(1, &id_y); glBindTexture(GL_TEXTURE_2D, id_y); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, linesize[0], h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_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); // double t3 = cc_clock(); glGenTextures(1, &id_u); glBindTexture(GL_TEXTURE_2D, id_u); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,linesize[1], h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_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); // double t4 = cc_clock(); glGenTextures(1, &id_v); glBindTexture(GL_TEXTURE_2D, id_v); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, linesize[2], h/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv[2]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_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); // double t5 = cc_clock(); // CCLOG("prog %f, unif %f , y= %f , u=%f , v=%f",t1-t0,t2-t1,t3-t2,t4-t3,t5-t4); CHECK_GL_ERROR_DEBUG(); textureDone = 1; } return true; } return false; }