国庆将至,分享用shader 画一幅国旗

开发工具: cocos creator2.4.3
工程文件: moon.zip (890.7 KB)
shader代码:

效果: GIF 2021-9-27 19-21-28

抱歉,还是变懒了, 不写教程了,shader关键代码如下,就写了相关注释,有兴趣的可以自己看

shader代码

CCProgram fs %{
precision highp float;
#include
#include
in vec4 v_color;

#if USE_TEXTURE
in vec2 v_uv0;
uniform sampler2D texture;
#endif

uniform MY_VALUE {
float tt;
};

#define PI 3.1415
#define S(x,y,z) smoothstep(x,y,z)
#define B(x,y,z,b) S(x, x+b, z)*S(y+b, y, z)
#define saturate(x) clamp(x,0.,1.)

#define MOD3 vec3(.1031,.11369,.13787)

#define MOONPOS vec2(1, .8)

// “The china Flag”
// by huataishi

vec3 WHITE = vec3(1);
vec3 RED = vec3(255, 0, 0)/255.;
vec3 YELLOW = vec3(255, 255, 0)/255.;
float BIGSTARTSIZE = 0.051;
float ROTATO = 18.;

float Star(vec2 uv, float size,vec2 pos,float rotato) { //画五角星
vec2 iResolution = vec2(960.,540.);
rotato += 36.;
uv.x = iResolution.x / iResolution.y;
uv -= pos; //将uv的原点移动到五角星的中心
//根据五角星旋转角度
uv = mat2(cos(3.14rotato/180.),-sin(3.14
rotato/180.),sin(3.14rotato/180.),cos(3.14rotato/180.));
//以下为旋转五角星
float a = mod( atan(uv.x,uv.y)5.,6.28 ) / 5. -3.14/5.,
angle = 3.14
(.5+.2),
d = length(uv)* sin(angle+abs(a)),
w = .001;
return length(uv)>.8 ? 0. : smoothstep(size + .005, size - .005, d); //smooth 去锯齿
}

vec3 Flag(vec2 uv) {
float y = sin(uv.y3.141513.);
//uv += .5;
float w = 0.001;
w = 0.01;
vec3 col = RED; //整体颜色改为红色
vec2 iResolution = vec2(960.,540.);
//以下画出五个五角星
col = mix(col, YELLOW, Star(uv, BIGSTARTSIZE,vec2(5./30. * iResolution.x / iResolution.y,6./20.),0.));
col = mix(col, YELLOW, Star(uv, BIGSTARTSIZE/3.,vec2(10./30. * iResolution.x / iResolution.y,2./20.),-ROTATO));
col = mix(col, YELLOW, Star(uv, BIGSTARTSIZE/3.,vec2(12./30. * iResolution.x / iResolution.y,4./20.),ROTATO));
col = mix(col, YELLOW, Star(uv, BIGSTARTSIZE/3.,vec2(12./30. * iResolution.x / iResolution.y,7./20.),0.));
col = mix(col, YELLOW, Star(uv, BIGSTARTSIZE/3.,vec2(10./30. * iResolution.x / iResolution.y,9./20.),-ROTATO));
//上下分别留出一小部分黑底,并抗锯齿
col = smoothstep(w, .0, abs(uv.y-.5)-.5+w);
return col;
}
//
void main () {
vec2 uv = v_uv0;
float t = uv.x
7.-2.tt+uv.y3.;
//随着时间变动y值
uv.y += sin(t)*.05;
vec3 col = Flag(uv);
//更具时间添加阴影
col = .7+cos(t).3;
gl_FragColor = vec4(col,1.);
}
}%

8赞

好 顶 赞!

大佬请喝茶:tea:

开源贡献者才算的上大佬