cocos2dx 实现水波纹效果

效果图:

先贴代码

  HelloWorld.cpp

	m_pBgSprite = Sprite::create("img_dating.png");
	//m_pBgSprite->setFlippedX(true);
	//m_sBgSize = m_pBgSprite->getContentSize();
	float waveSpeed = 0.3f;
	auto gp = GLProgram::createWithFilenames("maskBlend.vert", "maskBlend.frag");
	auto state = GLProgramState::create(gp);
	state->setUniformFloat("_distanceFactor", 300);
	state->setUniformFloat("_timeFactor", -30.0);
	state->setUniformFloat("_totalFactor", 0.01);
	state->setUniformFloat("_waveWidth", 0.5);
	state->setUniformFloat("_curWaveDis", 0);
	state->setUniformVec2("_startPos", Vec2(0.5,0.5));
	m_pBgSprite->setGLProgramState(state);
	m_pBgSprite->setPosition(Vec2(visibleSize.width / 2 , visibleSize.height / 2));
	addChild(m_pBgSprite);

maskBlend.vert

attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;

#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
void main()
{
    gl_Position = CC_PMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}

maskBlend.frag

#ifdef GL_ES
precision lowp float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform vec2 _startPos;
uniform float _distanceFactor; 
uniform float _timeFactor;
uniform float _totalFactor;  
uniform float _waveWidth;  
uniform float _curWaveDis;  
void main(void)
{
	vec2 dv = _startPos.xy - v_texCoord.xy;  
	float dis = sqrt(dv.x * dv.x + dv.y * dv.y);  
	float sinFactor = sin(dis * _distanceFactor + CC_Time * _timeFactor) * _totalFactor;  
	float discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1) / _waveWidth;  
	vec2 dv1 = normalize(dv);  
	vec2 offset = dv1  * sinFactor * discardFactor;  
	vec2 uv = offset + v_texCoord.xy;  
	gl_FragColor = texture2D(CC_Texture0 , uv) * v_fragmentColor ;  
}

_distanceFactor:调节波长

_timeFactor:调节波的方向和速度

_totalFactor:控制偏移量

_waveWidth:波纹范围

_startPos:震源位置

核心代码来源下面的文章

https://blog.csdn.net/yiwei151/article/details/78621495

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值