cocos2dx shader实现深入浅出的背景

<1>

void update(float dt);
void updateLocation(GLProgram* program,Uniform* uniform);
Sprite* _ballSp;
Vec2 _ballPosition;
<2>
//
Size winSize = Director::getInstance()->getWinSize();

//
auto program = GLProgram::createWithFilenames("light.vert","light.frag");
auto pstate = GLProgramState::create(program);
pstate->setUniformCallback("ballPosition",CC_CALLBACK_2(HelloWorld::updateLocation,this));

//
Sprite* water = Sprite::create("HelloWorld.png");
water->setPosition(Vec2(winSize.width / 2,winSize.height / 2));
water->setScale(winSize.width / water->getContentSize().width);
water->setGLProgramState(pstate);
this->addChild(water);

// 	
_ballSp = Sprite::create();
_ballSp->setPosition(Vec2(winSize.width / 2,water->getContentSize().height * (winSize.width / water->getContentSize().width) / 2 + winSize.height / 2));
this->addChild(_ballSp);

//
MoveTo* moveTo = MoveTo::create(10,Vec2(winSize.width / 2,winSize.height / 2 - water->getContentSize().height*(winSize.width / water->getContentSize().width) / 2));
_ballSp->runAction(moveTo);

//
this->scheduleUpdate();
<3>
void HelloWorld::update(float dt){
	_ballPosition = _ballSp->getPosition();
}

void HelloWorld::updateLocation(GLProgram* program,Uniform* uniform){
	program->setUniformLocationWith2f(uniform->location,_ballPosition.x,_ballPosition.y);
}
<4>light.vert
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
uniform   vec2 ballPosition;

#ifdef GL_ES
    varying lowp vec4 v_fragmentColor;
    varying mediump vec2 v_texCoord;
    varying lowp float v_alpha;
#else
    varying vec4 v_fragmentColor;
    varying vec2 v_texCoord;
    varying float v_alpha;
#endif

void main()
{
    float distance;
    gl_Position = CC_MVPMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
    v_alpha = 0.0;
    if(ballPosition.y < a_position.y){
        distance = a_position.y - ballPosition.y
	v_alpha = distance * 2.0 / a_position.y;
    }else{
        distance = ballPosition.y - a_position.y;
	v_alpha = (a_position.y - distance) / a_position.y;
    }
}
<5>light.frag
#ifdef GL_ES
    precision lowp float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
varying float v_alpha;

void main()
{
    gl_FragColor = v_alpha * v_fragmentColor * texture2D(CC_Texture0,v_texCoord);
}

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...