【Cocos Shader】Shader Animation 跳动的心

最终效果:


本Shader算法来自自Shadertoy, 原地址:https://www.shadertoy.com/view/XsfGRn


Shader的实现:

vs: heart.vert

attribute vec4 a_position;
attribute vec2 a_texCoord;

#ifdef GL_ES
varying lowp vec2 v_texCoord;
#else
varying vec2 v_texCoord;
#endif

void main()
{
	gl_Position = CC_PMatrix * a_position;
	v_texCoord = a_texCoord;
}
ps: heart.frag

#ifdef GL_ES
varying lowp vec2 v_texCoord;
#else
varying vec2 v_texCoord;
#endif

uniform vec2 u_screenSize;//视口大小,Director::getInstance()->getVisibleSize();
//uniform vec4 u_heartColor;
uniform float u_heartColorR;//heart的RGB值
uniform float u_heartColorG;
uniform float u_heartColorB;

void main()
{
	vec4 u_heartColor = vec4(u_heartColorR, u_heartColorG, u_heartColorB, 1.);
	vec2 fragCoord = vec2(v_texCoord.x, 1-v_texCoord.y)*u_screenSize.xy;
    vec4 u_bgColor = vec4(1.0);//背景颜色
    float _Blur = 0.02;//heart边缘模糊大小
    float _Duration = 1.5;//跳动周期

    vec2 p = (2.0*fragCoord.xy-u_screenSize.xy)/min(u_screenSize.y,u_screenSize.x);
    p.y -= 0.25;

    // heart跳动算法
    float tt = mod(CC_Time.y,1.5)/1.5;
    tt = mod(CC_Time.y,_Duration)/_Duration;
    float ss = pow(tt,.2)*0.5 + 0.5;
    ss = 1.0 + ss*0.5*sin(tt*6.2831*3.0 + p.y*0.5)*exp(-tt*4.0);
    p *= vec2(0.5,1.5) + ss*vec2(0.5,-0.5);
    // heart形状算法  
    float a = atan(p.x,p.y)/3.141593;
    float r = length(p);
    float h = abs(a);
    float d = (13.0*h - 22.0*h*h + 10.0*h*h*h)/(6.0-5.0*h);
    // Color
    float s = 1.0-0.5*clamp(r/d,0.0,1.0);
    s = 0.75 + 0.75*p.x;
    s *= 1.0-0.25*r;
    s = 0.5 + 0.6*s;
    s *= 0.5+0.5*pow( 1.0-clamp(r/d, 0.0, 1.0 ), 0.1 );
    vec3 hcol = vec3(1.0,0.5*r,0.3)*s;
    hcol = u_heartColor.xyz *s;
    vec3 col = mix( u_bgColor.xyz, hcol, smoothstep( -0.01, 0.01, d - r) );
    col = mix( u_bgColor.xyz, hcol, smoothstep( -_Blur, _Blur, d - r) );

	vec4 texColor = texture2D(CC_Texture0, v_texCoord);
    gl_FragColor = texColor * vec4(col, 1.0);
}

2.应用Shader:

auto bg = Sprite::create("HelloWorld.png");
	bg->setPosition(winSize / 2);
	this->addChild(bg);

 	auto programState = GLProgramState::getOrCreateWithGLProgram(GLProgram::createWithFilenames("shader/heart.vert", "shader/heart.frag"));
	
	//heart animation
	programState->setUniformVec2("u_screenSize", Director::getInstance()->getWinSize());
	programState->setUniformFloat("u_heartColorR", 1.0);//RGB值传入Shader
	programState->setUniformFloat("u_heartColorG", 0.0);
	programState->setUniformFloat("u_heartColorB", 0.0);

	programState->applyUniforms();
	bg->setGLProgramState(programState);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cocos ShaderCocos引擎中用于实现自定义渲染效果的功能。它基于OpenGL ES 2.0或OpenGL ES 3.0,并且可以在2D和3D场景中使用。 使用Cocos Shader,您可以创建各种独特的效果,如阴影、扭曲、发光等等。您可以通过编写GLSL(OpenGL Shading Language)代码来定义着色器程序,然后将其与Cocos引擎中的节点进行关联。 要使用Cocos Shader,首先需要创建一个自定义的Shader文件,然后在Cocos引擎中加载并应用它。您可以使用Cocos Creator编辑器或手动编写代码来实现这一点。 以下是一个简单的示例代码,展示了如何在Cocos Creator中使用Cocos Shader: ```javascript // 创建一个Sprite节点 var spriteNode = new cc.Node(); var sprite = spriteNode.addComponent(cc.Sprite); sprite.spriteFrame = new cc.SpriteFrame("path/to/your/image.png"); // 加载并应用Shader cc.loader.loadRes("path/to/your/shader", cc.RawAsset, function (err, shaderCode) { if (err) { cc.error(err.message || err); return; } // 创建自定义材质 var material = new cc.Material(); material.effectAsset = shaderCode; material.name = 'CustomShader'; // 将材质应用到Sprite节点上 sprite.setMaterial(0, material); }); ``` 在上述示例中,您需要将路径 "path/to/your/image.png" 替换为您的图像文件路径,将路径 "path/to/your/shader" 替换为您的Shader文件路径。 请注意,使用Cocos Shader需要对OpenGL ES和GLSL有一定的了解。如果您不熟悉这些概念,建议先学习相关知识。同时,Cocos官方提供了丰富的文档和示例代码,可供参考和学习。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值