加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx shader实现深入浅出的背景

发布时间:2020-12-14 21:19:54 所属栏目:百科 来源:网络整理
导读: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","ligh

<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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读