手绘轮廓线渲染的六种技术路径:从后处理到几何法的完整技术地图
六种描边方案原理图解 · 移动端适配临界点 · 混合方案设计 · 动态自适应描边系统
轮廓线是手绘游戏美术的视觉骨架
在手绘风格游戏美术中,轮廓线(Outline / Line)承担了远超「描边」这一狭义功能的角色。它是手绘风格与 3D 渲染之间最直接的视觉桥梁——3D 角色有了轮廓线才能「看起来像手绘」,失去了轮廓线则会退化为「带卡通贴图的 3D 角色」。一个手绘风格游戏如果轮廓线方案设计失败,整个美术风格的视觉一致性都会崩塌。
但轮廓线渲染不是「一种技术」,而是「一类技术」的统称。不同的轮廓线方案在视觉风格、性能开销、实现难度、跨平台适配性上各有显著差异。本文系统拆解 6 种主流的轮廓线技术路径:屏幕空间后处理、几何体反向膨胀(Back-Face Inflation)、法线扩张、深度法线边缘检测、几何细线(Geometry Silhouette)、程序化笔触映射。每种方案都有其适用场景与陷阱,没有「最好」的方案,只有「最合适」的方案。
本文面向两类读者:初级读者可以从「一键式选型决策树」一节获得快速选型方法;中级读者可以深入「六种方案完整拆解」一节获得每种方案的原理、代码骨架、性能数据与移动端适配策略。
一键式选型决策树:30 秒确定你的轮廓线方案
面对具体的项目需求时,先用以下决策树确定基础方案,再深入参数定制化阶段:
第一步:项目是否在移动端运行? 是 → 优先考虑「几何体反向膨胀」或「深度法线边缘检测」方案(性能最优)。否 → 可继续评估所有 6 种方案。
第二步:是否需要支持动态角色建模(如角色创建系统)? 是 → 避免使用「屏幕空间后处理」(对动态模型适应性差),优先「法线扩张」或「几何细线」。否 → 任何方案都可考虑。
第三步:是否需要风格化的笔触感(如 Arc System Works 的油画笔触)? 是 → 优先「程序化笔触映射」(其他方案无法实现)。否 → 优先「几何体反向膨胀」(实现最简单,跨平台兼容性最好)。
第四步:项目是否使用 PBR 渲染管线? 是 → 优先「屏幕空间后处理」或「深度法线边缘检测」(与 PBR 管线的集成最自然)。否 → 任何方案都可考虑。
第五步:项目预算(性能余量)? 高(PC/PS5/Xbox) → 「程序化笔触映射」或「几何细线」。中(PC 中端/PS4) → 「屏幕空间后处理」或「法线扩张」。低(移动端) → 「几何体反向膨胀」或简化版「深度法线边缘检测」。
完成这 5 步后,你会有一个明确的 1–2 个候选方案。再到下一节细看具体实现。
方案一·屏幕空间后处理描边(Screen-Space Post-Process Outline)
原理
在所有场景渲染完成后,对颜色缓冲进行全屏后处理,检测像素的深度差或法线差。当相邻像素的深度或法线差异超过阈值时,将该像素标记为边缘像素,并按描边宽度向外扩张。
核心实现(伪代码)
读取屏幕颜色缓冲 + 深度缓冲 + 法线缓冲 → 对每个像素采样其周围 8 个像素的深度/法线 → 计算差异 → 差异超过阈值则输出为描边颜色 → 与原颜色缓冲混合。整个过程在 fragment shader 中实现。
优势
实现最简单(不需要修改角色 Mesh),跨模型复用性强(同一份后处理 Shader 可处理任意数量的角色),与 PBR 管线天然兼容(基于深度/法线数据),描边宽度一致性强(屏幕空间,描边粗细不随距离变化)。
劣势
描边颜色与角色内部颜色无法区分(同色描边无法表现艺术家的「外轮廓更深、内部线条更细」的设计意图),远距离小角色可能产生描边过粗的伪影(因为屏幕空间描边宽度固定),动态角色或变形角色(Morph Target)适应性差(可能产生描边断裂),描边在角色与背景深度差异小时会消失。
性能数据
1080p 分辨率 + 中端 GPU:约 0.3–0.8 ms 帧时间开销。移动端(中端):约 1.5–3 ms 帧时间开销(已接近不可接受)。
典型案例
Unity 官方 URP 渲染管线中提供的 Renderer Feature 模板、UE 引擎自带的 Post-Process Outline 效果、《原神》早期版本的轮廓线实现、《崩坏:星穹铁道》部分角色外轮廓。
方案二·几何体反向膨胀描边(Back-Face Inflation / Shell Rendering)
原理
渲染角色 Mesh 的「反向法线版本」(即渲染 Back-Face 而非 Front-Face),并将反向 Mesh 沿法线方向向外膨胀一定距离。正常情况下角色渲染的是 Front-Face,反向 Mesh 只会出现在角色边缘未被 Front-Face 覆盖的位置(因为它在角色的「外面」),从而形成描边效果。
核心实现
复制原角色 Mesh → 反转法线方向(Cull Front 改为 Cull Back,或反之) → 在 Vertex Shader 中将顶点沿法线方向偏移固定距离(通常 0.01–0.05 世界单位)→ 渲染为描边颜色(通常是深色)。
优势
实现简单(不需要后处理 Pass),移动端性能极佳(不需要全屏扫描所有像素),描边宽度可随角色距离自适应(因为基于世界空间偏移),与角色动画系统天然兼容(Mesh 跟着角色动),描边颜色可以与角色内部颜色区分。
劣势
描边宽度与角色 Mesh 复杂度强相关(Mesh 越复杂,描边一致性越差),硬边角 Mesh 可能产生描边断裂(法线突变导致膨胀方向冲突),头发/飘带等薄片状结构会产生异常描边(厚度小于描边宽度的部分会被吞掉),无法实现内轮廓(只有外轮廓)。
性能数据
几乎是 6 种方案中性能开销最低的——只是额外渲染一次 Mesh,不涉及全屏后处理。1080p 中端 GPU:约 0.05–0.2 ms 帧时间。移动端:约 0.2–0.5 ms 帧时间。
典型案例
《塞尔达传说:旷野之息》、《原神》部分角色(米哈游在《崩坏 3》早期版本中大量使用)、《蔚蓝档案》、独立游戏《Hollow Knight》(部分实现使用类似原理)。
方案三·法线扩张描边(Normal Extrusion Outline)
原理
与方案二(几何体反向膨胀)类似,但膨胀方向不是简单沿法线,而是沿法线 + 切线的组合方向。这种方案可以避免方案二在硬边角处的描边断裂问题。
核心实现
在 Vertex Shader 中计算每个顶点的「平滑法线」(Smoothed Normal)→ 沿平滑法线方向偏移(而不是原始法线)→ 渲染为描边颜色。平滑法线的计算需要美术师预处理或在外部工具中烘焙(Blender、Maya、3ds Max 都有专门的「平滑法线」烘焙功能)。
优势
描边一致性显著优于方案二(特别是在硬边角处),可以表现外轮廓的「厚度变化」艺术效果(如胸甲描边比手臂描边粗),可与方案二组合使用实现「分层描边」(外轮廓粗、内部结构细)。
劣势
需要美术师预处理平滑法线(增加美术流程成本),Mesh 越复杂平滑法线烘焙越耗时,烘焙错误会导致描边异常(这是该方案最大的实际陷阱)。
典型案例
《原神》全角色、米哈游全系手游、《最终幻想 7 重制版》角色、《鬼泣 5》部分角色。
方案四·深度法线边缘检测(Depth-Normal Edge Detection)
原理
在屏幕空间后处理 Pass 中,同时采样深度缓冲与法线缓冲,对深度差与法线差做联合判定(Roberts Cross 算子或 Sobel 算子)。比方案一(只检测深度或法线)的精度更高,特别适合复杂场景中的多角色描边。
核心实现
渲染场景到深度/法线缓冲(G-Buffer)→ 全屏后处理 Pass 采样 3×3 邻域的深度与法线 → 计算差异 → 超过阈值则标记为边缘 → 输出描边颜色。Unity HDRP / UE5 都有现成的 Depth-Normal 边缘检测 Renderer Feature。
优势
边缘检测精度高(能识别方案一遗漏的细微边缘),可与 PBR 管线自然集成(基于 G-Buffer),支持「权重后处理」(不同区域使用不同描边宽度),可在边缘检测基础上叠加「艺术化描边」(如让描边颜色随光照变化)。
劣势
性能开销是 6 种方案中最高的(需要 G-Buffer + 全屏扫描),移动端几乎不可用(中端移动 GPU 跑不动),实现复杂度高(需要深度/法线缓冲的正确配置)。
性能数据
1080p 中端 GPU:约 1.0–2.5 ms 帧时间。移动端:几乎不可用(4–8 ms 帧时间,占用 25% 帧预算)。
典型案例
《使命召唤》系列的轮廓线(用于突出关键目标)、《赛博朋克 2077》近景角色、《原神》部分复杂场景的额外描边层。
方案五·几何细线(Geometry Silhouette / Geometric Line)
原理
在 Mesh 内部直接绘制「线条几何体」——美术师在建模阶段就为关键边缘创建独立的「线条 Mesh」(细长的矩形片),渲染为描边颜色。线条 Mesh 的位置、宽度、材质由美术师完全控制。
优势
完全可艺术化(描边颜色、宽度、纹理完全由美术师控制),可在任何位置绘制内轮廓(不限于外轮廓),可表现手绘感的「断线」「粗细变化」艺术效果,性能可接受(只渲染少量线条 Mesh)。
劣势
美术成本极高(每个需要描边的边缘都要手动建模线条 Mesh),Mesh 动画时线条可能与角色脱节(特别是软体动画),不适合动态变化的角色(如 Morph Target),跨平台兼容性差(不同引擎对细线渲染的支持差异大)。
典型案例
《最终幻想 7》(PS1 时代)、《最终幻想 9》部分角色、《生化危机》系列部分场景的内部线条、《茶杯头》(Cuphead)的部分高光线条(虽然 Cuphead 是 2D 但内部线条绘制逻辑类似)。
方案六·程序化笔触映射(Procedural Brush Stroke Mapping)
原理
在屏幕空间后处理 Pass 中,将检测到的边缘像素映射到一张「笔触纹理」(Brush Stroke Texture,通常是手绘风格的条纹或斑驳纹理),让描边表现出「手绘笔触感」而不是均匀的纯色线。这是 Arc System Works 标志性的技术风格。
核心实现
边缘检测(同方案四)→ 边缘位置映射到笔触纹理 UV → 笔触纹理采样与描边颜色混合 → 输出。笔触纹理可以是手绘的位图(带噪点、不规则、轻微断裂)也可以是程序化生成的 Perlin 噪声纹理。
优势
视觉风格独特(其他 5 种方案都无法实现的「手绘笔触感」),艺术控制力强(笔触纹理可由美术师完全自定义),可表现「断裂描边」「毛糙描边」「半透明描边」等高级效果。
劣势
实现复杂度最高(边缘检测 + 笔触映射 + 风格化处理三步叠加),性能开销与方案四相近(同样需要后处理 + G-Buffer),笔触纹理的制作成本高(每种风格都需要专门的笔触纹理资产),调试困难(描边异常可能来自多个环节的叠加错误)。
典型案例
《罪恶装备》(Guilty Gear Xrd、Strive)系列、《苍翼默示录》(BlazBlue)系列、《女神异闻录 5》战斗部分、《龙珠 FighterZ》、Arc System Works 几乎所有现代作品。
混合方案设计:生产级手绘游戏的真实选择
在实际的工业级手绘游戏中,单一描边方案往往不够用。主流方案是「外轮廓 + 内轮廓」分层叠加:
推荐混合方案一:方案二 + 方案五
外轮廓用「几何体反向膨胀」(性能好、跨平台兼容),内轮廓用「几何细线」(艺术控制力强)。这是中小型手绘项目的最常见组合,性能与艺术控制力的平衡最好。代表:Hollow Knight 角色、各种独立游戏 JRPG。
推荐混合方案二:方案三 + 方案四
主轮廓用「法线扩张」(描边粗细可艺术化),辅助轮廓用「深度法线边缘检测」(捕捉法线扩张遗漏的细微边缘)。这是大型商业手绘游戏的常见组合。代表:原神、崩坏系列、最终幻想 7 重制版。
推荐混合方案三:方案二 + 方案六
外轮廓用「几何体反向膨胀」(基础描边),风格化覆盖用「程序化笔触映射」(在基础描边上叠加笔触纹理)。这是 Arc System Works 风格的标准实现,但成本也最高。代表:罪恶装备 Strive、苍翼默示录 Cross Tag Battle。
移动端专项:方案二 + 简化版方案一
外轮廓用「几何体反向膨胀」(主描边),内部精细结构用「屏幕空间后处理描边的简化版」(仅检测深度差,不检测法线差,降低性能开销)。这是中端移动设备的手绘游戏可行方案。代表:原神移动端、崩坏 3 移动端。
动态自适应描边系统:让描边随场景智能调整
在大型手绘游戏中,描边的「智能调整」是提升视觉一致性的关键。以下是 3 个工业级技巧:
技巧一:距离自适应描边宽度
描边宽度随角色到相机的距离动态调整(远距离角色描边更粗、近距离角色描边更细),避免远距离小角色「描边过细消失」或「描边过粗吞掉角色细节」。实现:在描边 Shader 中采样深度值,按深度调整描边宽度系数。
技巧二:动态权重描边(多 Pass 描边)
为不同部位设置不同描边宽度(角色外轮廓粗、内部结构细、装饰线条更细),通过顶点属性或顶点颜色控制每个区域的描边宽度。这是米哈游系游戏的标志性技术。
技巧三:法线权重描边
在屏幕空间后处理中,按像素的法线方向调整描边颜色(朝光面描边更亮、背光面描边更暗),让描边有「光照响应」效果。这是高级手绘游戏的精细化调整。
常见问题 FAQ
选择描边方案时最大的实际陷阱是什么?
最大的实际陷阱是「选择了与角色 Mesh 复杂度不匹配的方案」。简单的低面数角色(如《塞尔达:旷野之息》林克)几乎所有方案都能正常工作,但高面数角色(特别是头发、飘带、复杂服装细节)会让某些方案出现明显伪影。强烈建议在选择方案前,先用 3–5 个最复杂的角色 Mesh 测试所有候选方案,再做最终决策。
动态骨骼角色(如长发、飘带)的描边最常用什么方案?
动态骨骼角色描边是行业难题,没有完美方案。主流妥协方案是「几何体反向膨胀 + 头发/飘带区域使用简化描边」(如降低描边宽度或完全去除描边),或者「改用多 Pass 后处理 + 深度差检测」(头发/飘带的边缘天然产生深度差,可以被后处理识别)。米哈游的处理是「外轮廓用反向膨胀 + 头发/飘带几乎不描边,只保留末端轮廓」,这是视觉效果与性能的最佳平衡。
程序化笔触纹理的笔触素材应该怎么制作?
程序化笔触纹理有两种制作路径。第一种是「手绘路径」:美术师在 Aseprite 或 Photoshop 中手绘笔触(条纹、不规则边缘、轻微断裂、颜色变化),导出为 PNG 纹理。第二种是「程序化路径」:使用 GIMP、Krita 或 Substance Designer 程序化生成笔触纹理(基于 Perlin 噪声 + 边缘扰动 + 不规则掩码)。工业级游戏通常两种都做:手绘笔触提供「艺术感」、程序化笔触提供「风格变体」。建议准备 4–8 种笔触纹理,覆盖不同描边粗细需求。