GLProgram* GLProgram::createWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename, const std::string& compileTimeDefines) { auto ret = new (std::nothrow) GLProgram(); if(ret && ret->initWithFilenames(vShaderFilename, fShaderFilename, compileTimeDefines)) { ret->link(); ret->updateUniforms(); ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return nullptr; }
Effect3DOutline::Effect3DOutline() : _outlineWidth(1.0f) , _outlineColor(1, 1, 1) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) _backToForeGroundLister = EventListenerCustom::create(EVENT_COME_TO_FOREGROUND, [this](EventCustom*) { auto glProgram = _glProgramState->getGLProgram(); glProgram->reset(); glProgram->initWithFilenames(_vertShaderFile, _fragShaderFile); glProgram->link(); glProgram->updateUniforms(); } ); Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForeGroundLister, -1); #endif }
void UVEffectSprite::InitShader() { auto p = new GLProgram(); p->initWithFilenames("Shaders/uv.vsh", "Shaders/uv.fsh"); p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION); p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS); p->link(); p->updateUniforms(); this->setGLProgram(p); auto textrue = Director::getInstance()->getTextureCache()->addImage("soroll_uv3.png"); Texture2D::TexParams tRepeatParams;//设置纹理渲染方式 tRepeatParams.magFilter = GL_LINEAR_MIPMAP_LINEAR; tRepeatParams.minFilter = GL_LINEAR; tRepeatParams.wrapS = GL_REPEAT; tRepeatParams.wrapT = GL_REPEAT; textrue->setTexParameters(tRepeatParams);//将贴图设置给Shader中的变量值u_texture1 _lightani.x = _lightani.y = 0.0f; getGLProgramState()->setUniformTexture("u_lightTexture", textrue); getGLProgramState()->setUniformVec2("v_animLight", _lightani); }
void ShaderNode::loadShaderVertex(const std::string &vs, const std::string &fs) { auto shader = new GLProgram(); shader->initWithFilenames(vs, fs); this->setShaderProgram(shader); shader->release(); CHECK_GL_ERROR_DEBUG(); shader->bindAttribLocation("a_position", GLProgram::VERTEX_ATTRIB_POSITION); CHECK_GL_ERROR_DEBUG(); shader->link(); CHECK_GL_ERROR_DEBUG(); shader->updateUniforms(); CHECK_GL_ERROR_DEBUG(); _uniformResolution = shader->getUniformLocation("resolution"); this->buildCustomUniforms(); CHECK_GL_ERROR_DEBUG(); }
bool GLProgram::initWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename) { return initWithFilenames(vShaderFilename, fShaderFilename, EMPTY_DEFINE); }
bool GLProgram::initWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename, const std::string& compileTimeDefines) { return initWithFilenames(vShaderFilename, fShaderFilename, EMPTY_DEFINE, compileTimeDefines); }
void FogTestDemo::onEnter() { CameraBaseTest::onEnter(); schedule(schedule_selector(FogTestDemo::update), 0.0f); Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1)); auto s = Director::getInstance()->getWinSize(); auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesMoved = CC_CALLBACK_2(FogTestDemo::onTouchesMoved, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // swich fog type TTFConfig ttfConfig("fonts/arial.ttf", 20); auto label1 = Label::createWithTTF(ttfConfig,"Linear "); auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,0)); auto label2 = Label::createWithTTF(ttfConfig,"Exp"); auto menuItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,1)); auto label3 = Label::createWithTTF(ttfConfig,"Exp2"); auto menuItem3 = MenuItemLabel::create(label3, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,2)); auto menu = Menu::create(menuItem1, menuItem2, menuItem3, nullptr); menu->setPosition(Vec2::ZERO); menuItem1->setPosition(VisibleRect::left().x+60, VisibleRect::top().y-50); menuItem2->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -100); menuItem3->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -150); addChild(menu, 0); auto layer3D=Layer::create(); addChild(layer3D,0); _layer3D=layer3D; _shader =GLProgram::createWithFilenames("Sprite3DTest/fog.vert","Sprite3DTest/fog.frag"); _state = GLProgramState::create(_shader); _sprite3D1 = Sprite3D::create("Sprite3DTest/teapot.c3b"); _sprite3D2 = Sprite3D::create("Sprite3DTest/teapot.c3b"); _sprite3D1->setGLProgramState(_state); _sprite3D2->setGLProgramState(_state); //pass mesh's attribute to shader long offset = 0; auto attributeCount = _sprite3D1->getMesh()->getMeshVertexAttribCount(); for (auto i = 0; i < attributeCount; i++) { auto meshattribute = _sprite3D1->getMesh()->getMeshVertexAttribute(i); _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, _sprite3D1->getMesh()->getVertexSizeInBytes(), (GLvoid*)offset); offset += meshattribute.attribSizeBytes; } long offset1 = 0; auto attributeCount1 = _sprite3D2->getMesh()->getMeshVertexAttribCount(); for (auto i = 0; i < attributeCount1; i++) { auto meshattribute = _sprite3D2->getMesh()->getMeshVertexAttribute(i); _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, _sprite3D2->getMesh()->getVertexSizeInBytes(), (GLvoid*)offset1); offset1 += meshattribute.attribSizeBytes; } _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); _state->setUniformFloat("u_fogStart",10); _state->setUniformFloat("u_fogEnd",60); _state->setUniformInt("u_fogEquation" ,0); _layer3D->addChild(_sprite3D1); _sprite3D1->setPosition3D( Vec3( 0, 0,0 ) ); _sprite3D1->setScale(2.0f); _sprite3D1->setRotation3D(Vec3(-90,180,0)); _layer3D->addChild(_sprite3D2); _sprite3D2->setPosition3D( Vec3( 0, 0,-20 ) ); _sprite3D2->setScale(2.0f); _sprite3D2->setRotation3D(Vec3(-90,180,0)); if (_camera == nullptr) { _camera=Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000); _camera->setCameraFlag(CameraFlag::USER1); _camera->setPosition3D(Vec3(0, 30, 40)); _camera->lookAt(Vec3(0,0,0), Vec3(0, 1, 0)); _layer3D->addChild(_camera); } _layer3D->setCameraMask(2); #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom*) { Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1)); auto glProgram = _state->getGLProgram(); glProgram->reset(); glProgram->initWithFilenames("Sprite3DTest/fog.vert","Sprite3DTest/fog.frag"); glProgram->link(); glProgram->updateUniforms(); _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); _state->setUniformFloat("u_fogStart",10); _state->setUniformFloat("u_fogEnd",60); _state->setUniformInt("u_fogEquation" ,0); } ); Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); #endif }