SuperAPI AI 工具集

blender-stylized-npr

设计与创作

查看项目

更新于 10-31 20:04

技能介绍

用途

该技能用于在 Blender 5.2 中制作风格化 / NPR 外观,包括卡通与赛璐璐着色(色阶分段、阴影染色、边缘光、硬高光)、带自定义法线的动漫脸、反向壳描边等。执行模型位于 blender-core,基础颜色仍来自 blender-pbr-materials / blender-texturing,本技能替换的是光照方式。

主要能力与使用方式

核心脚本为 scripts/toon_setup.py,通常一次调用即可完成设置。示例:

  • scripts/toon_setup.py -- --objects Hero Sword --bands 2 --rim 0.4 --outline 0.004
  • scripts/toon_setup.py -- --objects Hero --bands 3 --spec 0.3 --smooth-normals(同时生成引擎描边数据)
  • scripts/toon_setup.py -- --objects Hero --lighting scene(EEVEE:全部灯光与投射阴影)
  • scripts/toon_setup.py -- --line-art --outline 0(场景级 Line Art)
  • scripts/toon_setup.py -- --objects Hero Sword --remove --line-art(精确还原)

脚本会在每个材质的 Principled 基础色与输出之间插入 NPR_Toon 自发光组,并记录原始表面链接以便 --remove 还原;重复运行会就地更新参数。

光照模式:

  • --lighting key(默认,Cycles + EEVEE):对单个太阳光做 N·L 着色;没有太阳光时创建 NPR_Key;驱动器跟随太阳旋转,可旋转太阳来导演阴影形状,与引擎卡通着色器一致,导出后观感匹配。
  • --lighting scene:在白色漫反射上使用 Shader to RGB,使所有灯光与投射阴影共同塑造色阶,仅 EEVEE 支持。实测 Cycles 中 Shader to RGB 返回常量,与光照无关。

色阶与材质参数:

  • --bands 2(亮/暗,经典动漫)或 3(在 --threshold 之上增加 0.45 的中间带)。
  • --softness(0.02)为色带边缘半宽,设为 0 会锯齿。
  • --shadow-tint 会乘以基础色,建议使用冷而饱和的色调(如 0.6, 0.55, 0.75),避免灰/黑,因为灰色阴影显得脏。
  • --rim(0–1)添加亮侧边缘光;--spec(0–1)添加硬 Blinn 高光圆盘(头发/金属 0.2–0.4,皮肤为 0)。
  • 视图变换设为 Standard:AgX/Filmic 会降低饱和度并压缩平涂颜色,只有 Standard 下所选反照率才等于最终像素;--remove 时恢复原设置。

描边方案(可同时使用多种)

  • 反向壳(--outline,单位米):适用于 Cycles、EEVEE 与游戏引擎;向外 Solidify、翻转法线、描边槽、Backfacing→透明。1.75 米角色宽度 2–6 毫米。--outline-group 可用顶点组控制宽度(向尖端收细,口腔内部为 0)。
  • --smooth-normals:供引擎描边着色器使用;NPR_OutlineNormal 角点颜色为切线空间中的位置焊接法线(0.5 + 0.5n),避免硬边/UV 接缝开缝;解码 n = TBN·(c·2−1)。
  • Line Art(--line-art,Grease Pencil):从相机生成轮廓、折痕与相交线,需要场景相机;--line-radius(米)。
  • Freestyle:设置 scene.render.use_freestyle = True,线宽以像素计;最慢但选项最多。 已知壳限制:交线与内侧折痕缺失(渲染时用 Line Art 补充),硬边网格会拆开壳;Blender 中在 Solidify 前按距离合并,引擎中用 --smooth-normals。

动漫脸与头发

真实法线产生的面部阴影会斑驳。从一个简单椭球代理转移自定义法线:Data Transfer 修改器,use_loop_data=True、data_types_loops={'CUSTOM_NORMAL'}、loop_mapping='POLYINTERP_NEAREST'(4.1 起无需自动平滑),用面部顶点组遮罩。引擎会导入自定义法线(FBX/glTF 导出法线)。风格化鼻/颊阴影在游戏中多用按光照角度采样的 SDF 面部阴影贴图,应作为灰度阈值图制作,而非在节点树中。头发:强 --spec 加上基础色纹理中手绘的高光带(“天使环”)。

Grease Pencil(5.x API)

创建方式示例: gp = bpy.data.grease_pencils.new("Ink"); ob = bpy.data.objects.new("Ink", gp); scene.collection.objects.link(ob) mat = bpy.data.materials.new("Ink"); bpy.data.materials.create_gpencil_data(mat); gp.materials.append(mat) drawing = gp.layers.new("Lines").frames.new(1).drawing drawing.add_strokes([3]); s = drawing.strokes[0] for i, p in enumerate(s.points): p.position, p.radius = (i * 0.5, 0, 0), 0.01 # radius in m 笔画可访问 cyclic、material_index、fill_id、hide_stroke;原始属性在 drawing.attributes(position、radius)。GreasePencilv3 / grease_pencils_v3 在 5.0 已移除。5.2 的 Line Art 可输出填充笔画(fill_strokes)。

导出到游戏引擎

节点卡通着色不会导出。应导出基础色纹理,在引擎中重建卡通渐变(UE 材质/后处理、Unity URP toon shader、Godot ShaderMaterial),用同一太阳方向驱动。描边壳可作为第二材质槽随模型导出(应用修改器),或使用 NPR_OutlineNormal 供着色器描边通道。glTF 中平涂无光照资产可用 Background 着色器,或用 Light Path Is Camera Ray 混合 Transparent→Background:两者都导出为 KHR_materials_unlit。自发光在黑色基础上导出为 emissive,而非 unlit(实测)。

注意事项

  • 在 --outline 前应用缩放:Solidify 厚度基于对象空间。
  • 泛光与 AO 会破坏平涂效果;保持环境暗且均匀,使用一个主光,或许加一个轮廓光。
  • --lighting scene 的色带会随灯光强度偏移(亮度 0.3 ≈ 阈值 0);应调整 --threshold 而非灯光功率。

适用场景与限制

适用于动漫风格角色与道具、游戏资产的卡通着色与描边、需要与引擎观感一致的项目。限制包括:节点卡通着色无法直接导出到引擎;--lighting scene 仅 EEVEE 可用;反向壳存在交线/折痕缺失与硬边拆分问题;Line Art 需要场景相机;Freestyle 最慢。