第9.4章:2D描边着色器

描边效果是2D游戏中非常常见的视觉增强技术,用于突出角色、UI元素、提高可读性等。本章将详细介绍各种描边技术的实现方法。

🎯 学习目标

  • 理解描边效果的基本原理
  • 掌握外描边和内描边技术
  • 学会实现多色描边和动态描边
  • 理解距离场描边的高级应用

💡 描边原理

基础概念

描边通过检测边缘并在周围绘制颜色实现:

1
2
3
4
5
6
7
// 基础描边检测float edge = 0.0;
for (int i = -outlineWidth; i <= outlineWidth; i++) {
for (int j = -outlineWidth; j <= outlineWidth; j++) {
vec2 offset = vec2(i, j) * texelSize;
edge += texture(mainTexture, uv + offset).a;
}
}

描边类型分类

1
2
3
4
外描边 - 在透明区域绘制边缘
内描边 - 在不透明区域内侧绘制
双向描边 - 同时包含内外描边
发光描边 - 具有渐变发光效果

🔧 基础描边效果

1. 简单外描边

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
CCEffect %{
techniques:
- name: simple-outline
passes:
- vert: outline-vs:vert
frag: simple-outline-fs:frag
properties: &props
mainTexture: { value: white }
outlineColor: { value: [0, 0, 0, 1], editor: { type: color } }
outlineWidth: { value: 2.0, range: [1, 10] }
textureSize: { value: [512, 512], editor: { type: vec2 } }
}%

CCProgram outline-vs %{
precision highp float;
#include <cc-global>

in vec3 a_position;
in vec2 a_texCoord;

out vec2 v_uv;

vec4 vert() {
v_uv = a_texCoord;
return cc_matViewProj * vec4(a_position, 1);
}
}%

CCProgram simple-outline-fs %{
precision highp float;

uniform sampler2D mainTexture;
uniform vec4 outlineColor;
uniform float outlineWidth;
uniform vec2 textureSize;

in vec2 v_uv;

vec4 frag() {
vec2 texelSize = 1.0 / textureSize;
vec4 originalColor = texture(mainTexture, v_uv);

// 如果当前像素不透明,直接返回原颜色
if (originalColor.a > 0.5) {
return originalColor;
}

// 检测周围是否有不透明像素
float outline = 0.0;
float samples = 0.0;

for (float x = -outlineWidth; x <= outlineWidth; x += 1.0) {
for (float y = -outlineWidth; y <= outlineWidth; y += 1.0) {
vec2 offset = vec2(x, y) * texelSize;
float alpha = texture(mainTexture, v_uv + offset).a;
outline += alpha;
samples += 1.0;
}
}

outline /= samples;

// 生成描边
if (outline > 0.1) {
return outlineColor;
}

return originalColor;
}
}%

📖 本章总结

通过本章学习,我们掌握了:

  • ✅描边效果的基本原理和实现
  • ✅外描边、内描边和可调节描边技术
  • ✅发光描边、彩虹描边等高级特效
  • ✅距离场描边的高质量实现
  • ✅完整的TypeScript控制系统

🚀 下一步学习

完成了第9章的2D着色器特效学习后,建议继续学习:
👉 第10章:3D高级特效

💡 实践练习

  1. 创建一个UI元素的描边系统
  2. 实现游戏道具的品质描边效果
  3. 开发角色选中时的动态描边

系列导航