Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
bool GLProgram::initWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename)
{
    return initWithFilenames(vShaderFilename, fShaderFilename, EMPTY_DEFINE);
}
Esempio n. 6
0
bool GLProgram::initWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename, const std::string& compileTimeDefines)
{
    return initWithFilenames(vShaderFilename, fShaderFilename, EMPTY_DEFINE, compileTimeDefines);
}
Esempio n. 7
0
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

}