摘要
最近在学习Shader犹如观看天书一般,想找个cocos shader视频教学也不怎么好找,还会在网上发现一篇大佬写的shader教程天煞魔猎手,大佬文章写的非常好,有需要可以看下。
在cocos中想有shader写特效最大的痛点就是,不知道该如何下手具体从哪里看起、参考视频很少网上大多都是U3D的shader学习
版本说明
使用 CocosCreator 的 2.4.3 版本。
开始
效果演示:

介绍:
cocos中的shader是用GLSL语言进行编写(具体是啥我也不知道),我认为刚接触shader最大的疑惑就是数据哪里来,我怎么才能获取到。
- 顶点shader从渲染管道里获取数据
- CPU传递数据给顶点shader,着色shader
- 顶点shader数据传递给着色shader
vert 属性是指定顶点 Shader 片段的名字,frag 属性是指定片元 Shader 片段的名字,每个都是以main为入口
shader圆形效果可以解决圆形有锯齿的问题,主要用distance以及smoothstep方法
创建:
首先我们创建材质球(Material)、Shader(Effect)。
- 右键->新建->Material,Effect文件
- 文件创建完成后选择材质球并在右侧选择刚刚创建的Effect文件
- 并把需要原件话的图片拖拽到定义的texture中(如果没有请复制下方代码)


CCEffect结构的注解以及实现圆角效果:
这里CCEffect结构的注解还有引用开始摘要大佬的注解,大佬的注解文件放在了git 仓库的 builtin-2d-sprite-explain
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
CCEffect %{ # techniques 是一个数组 techniques: # passes 是 techniques 数组的第0项 # 同时 passes 也是一个数组,存放渲染管道描述的数组集合 - passes: # passes 数组的第0项,完整的渲染流水线 # vert 属性是指定顶点 Shader 片段的名字,如:这里的顶点 Shader 片段的名字为 vs # 根据文档介绍还可以这样子指定片段的入口函数 vs:vert ,那么就代替main函数,vert才是入口函数 - vert: vs # frag 属性是指定片元 Shader 片段的名字,如:这里的片元 Shader 片段的名字为 fs # 根据文档介绍还可以这样子指定片段的入口函数 fs:frag ,那么就代替main函数,frag才是入口函数 frag: fs # 混合模式开启 blendState: targets: - blend: true rasterizerState: cullMode: none # properties 列出可以在 Inspector 编辑器编辑的属性 properties: texture: { value: white } }%
CCProgram vs %{ precision highp float; #include <cc-global> #include <cc-local>
in vec3 a_position;
in vec4 a_color;
out vec4 v_color;
#if USE_TEXTURE
in vec2 a_uv0;
out vec2 v_uv0; #endif
void main () { vec4 pos = vec4(a_position, 1);
#if CC_USE_MODEL pos = cc_matViewProj * cc_matWorld * pos; #else pos = cc_matViewProj * pos; #endif
#if USE_TEXTURE v_uv0 = a_uv0; #endif
v_color = a_color;
gl_Position = pos; } }%
CCProgram fs %{ precision highp float; #include <alpha-test> in vec4 v_color; #if USE_TEXTURE in vec2 v_uv0; uniform sampler2D texture; #endif
void main () { vec4 color = v_color; float feather = 0.01; color *= texture(texture, v_uv0); if (color.a == 0.0) discard; float dis = distance(vec2(v_uv0.x, v_uv0.y), vec2(0.5, 0.5)); color.a = smoothstep(0.5,0.5 - feather, dis); color.a *= v_color.a;
gl_FragColor = color; } }%
|
重要:
distance函数:
p0
指定两点中的第一个
p1
指定两点中的第二个
distance()
计算向量p0,p1之间的距离
smoothstep函数:
平滑阶梯函数,平滑过渡函数,该函数具体意思我也未理解用就完了
个人理解,大佬勿喷