效果图:
先贴代码
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:震源位置
核心代码来源下面的文章