Cocos Creator Shader踩坑记录
写Shader时踩了不少坑,记录一下GLSL基础语法和实际用过的特效实现,包括闪白、水波纹、水面倒影这些效果。
Shader基础知识
Shader类型
| 类型 | 简称 | 作用 | 处理阶段 |
|---|---|---|---|
| 顶点着色器 | Vertex Shader | 处理顶点数据 | 顶点处理阶段 |
| 片段着色器 | Fragment Shader | 计算像素颜色 | 光栅化阶段 |
| 几何着色器 | Geometry Shader | 处理几何图元 | 可选阶段 |
Cocos Creator主要用顶点着色器和片段着色器。
Cocos Creator Shader结构
1 | // Effect文件结构 |
GLSL基础语法
数据类型
1 | // 标量类型 |
修饰符
1 | // 存储修饰符 |
内置函数
通用函数
| 函数 | 说明 | 示例 |
|---|---|---|
abs(x) |
绝对值 | abs(-1.0) = 1.0 |
sign(x) |
符号函数 | sign(-5.0) = -1.0 |
floor(x) |
向下取整 | floor(2.7) = 2.0 |
ceil(x) |
向上取整 | ceil(2.2) = 3.0 |
fract(x) |
小数部分 | fract(2.7) = 0.7 |
mod(x, y) |
取模 | mod(10.0, 3.0) = 1.0 |
min(x, y) |
取最小值 | min(2.0, 3.0) = 2.0 |
max(x, y) |
取最大值 | max(2.0, 3.0) = 3.0 |
clamp(x, minVal, maxVal) |
限制范围 | clamp(10.0, 0.0, 1.0) = 1.0 |
mix(x, y, a) |
线性插值 | mix(0.0, 1.0, 0.5) = 0.5 |
step(edge, x) |
阶梯函数 | step(0.5, 0.7) = 1.0 |
smoothstep(edge0, edge1, x) |
平滑阶梯 | 平滑过渡 |
1 | // 函数使用示例 |
三角函数
| 函数 | 说明 | 参数 |
|---|---|---|
radians(degrees) |
角度转弧度 | 角度值 |
degrees(radians) |
弧度转角度 | 弧度值 |
sin(angle) |
正弦 | 弧度 |
cos(angle) |
余弦 | 弧度 |
tan(angle) |
正切 | 弧度 |
asin(x) |
反正弦 | -1到1 |
acos(x) |
反余弦 | -1到1 |
atan(y, x) |
反正切 | y/x |
1 | // 正弦波动画 |
指数函数
| 函数 | 说明 | 示例 |
|---|---|---|
pow(x, y) |
x的y次幂 | pow(2.0, 3.0) = 8.0 |
exp(x) |
e的x次幂 | exp(1.0) = 2.718… |
log(x) |
自然对数 | log(2.718) = 1.0 |
exp2(x) |
2的x次幂 | exp2(3.0) = 8.0 |
log2(x) |
以2为底的对数 | log2(8.0) = 3.0 |
sqrt(x) |
平方根 | sqrt(9.0) = 3.0 |
inversesqrt(x) |
平方根的倒数 | inversesqrt(4.0) = 0.5 |
几何函数
| 函数 | 说明 | 返回值 |
|---|---|---|
length(v) |
向量长度 | float |
distance(p0, p1) |
两点距离 | float |
dot(v1, v2) |
点积 | float |
cross(v1, v2) |
叉积(仅vec3) | vec3 |
normalize(v) |
归一化 | 同类型向量 |
reflect(I, N) |
反射向量 | 同类型向量 |
refract(I, N, eta) |
折射向量 | 同类型向量 |
1 | // 计算光照方向 |
Cocos Creator内置Uniform
时间相关
1 | uniform CCGlobal { |
矩阵变换
1 | uniform CCGlobal { |
颜色相关
1 | in vec4 v_color; // 从顶点着色器传入的颜色 |
实战特效案例
闪白效果(Flash White)
游戏中角色受击时的视觉反馈。
1 | // FlashWhite.effect |
TypeScript使用:
1 | // 普通Sprite闪白 |
Spine动画闪白
1 | // FlashWhiteSpine.effect |
1 | // Spine动画闪白 |
水波纹效果
1 | // WaterRipple.effect |
使用说明:
- 创建材质并绑定此Shader
- 设置
texture2为噪声纹理(Perlin噪声图) - 噪声图的WrapMode设置为Repeat
水面倒影效果
1 | // WaterReflection.effect |
TypeScript实现(结合RenderTexture):
1 | const { ccclass, property } = cc._decorator; |
高级技巧
多重纹理混合
1 | void main() { |
UV动画
1 | uniform float u_speed; |
边缘发光
1 | // 基于法线的边缘发光 |
性能优化
精度选择
1 | // 顶点着色器:使用highp |
避免动态分支
1 | // 不推荐:复杂的if分支 |
减少纹理采样
1 | // 不推荐:多次采样同一纹理 |
调试技巧
可视化调试
1 | // 输出UV坐标 |
这些都是实际项目中用过的Shader效果,GLSL语法和内置函数是基础,特效实现需要多调试。闪白效果用得最多,水波纹和倒影适合做场景氛围。