关于 blender-stylized-npr
为 Blender 创建 NPR 卡通着色与轮廓效果的技能,面向制作风格化角色和场景的艺术家。它通过脚本配置色阶、光照、边缘光及多种描线方式,并支持还原材质改动。
主要功能
- 01配置卡通色阶与阴影色
- 02设置边缘光和高光
- 03支持倒壳与 Line Art 描线
- 04生成引擎轮廓用法线数据
- 05记录并还原原始材质连接
适用场景
- 01为角色制作动漫风格明暗
- 02为模型添加轮廓线
- 03调整阴影以匹配主光方向
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-stylized-npr安装后在 Claude Code 中输入/blender-stylized-npr确认已加载。
附带文件scripts/_bpyx.pyscripts/toon_setup.py
详细介绍
风格化 / NPR
执行模型位于 blender-core。基础颜色仍来自 blender-pbr-materials/blender-texturing。此技能会替换它们的受光方式。
每项各调用一次
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 # + engine outline data
scripts/toon_setup.py -- --objects Hero --lighting scene # EEVEE: all lights + cast shadows
scripts/toon_setup.py -- --line-art --outline 0 # scene-wide Line Art
scripts/toon_setup.py -- --objects Hero Sword --remove --line-art # exact restore
toon_setup.py
- 在每个材质的 Principled 基础色与输出之间插入一个
NPR_Toon发射节点组,并记录原始表面连接,以供--remove使用。重新运行时会原位更新数值。 --lighting key(默认,Cycles + EEVEE):着色 = 相对于单个太阳光源的 N·L(--light;若没有,则创建NPR_Key)。驱动器会跟随太阳光源的旋转,因此旋转太阳光源即可艺术化调整阴影形状。这就是引擎卡通着色器的工作方式,导出后效果也一致。--lighting scene:对白色漫反射材质使用 Shader to RGB,因此每个灯光和投射阴影都会塑造色带。**仅限 EEVEE。**实测:在 Cycles 中,Shader to RGB 无论光照如何都会返回常量(太阳光源为 0、3 和 10 W/m² 时,渲染结果相同)。- 色带: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)。- 设置 view transform Standard:AgX/Filmic 会降低平面颜色的饱和度并压缩它们,因此只有使用 Standard 时,选定的反照率才会成为最终像素颜色。执行
--remove时会还原原始设置。
轮廓(专业人士会同时使用多种方法)
| 方法 | 适用场景 | 备注 |
|---|---|---|
反转外壳(--outline,m) | Cycles、EEVEE、引擎 | 向外 Solidify,翻转法线,设置轮廓材质槽,Backfacing→transparent。身高 1.75 m 的角色,宽度为 2–6 mm。--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(m) |
| Freestyle | 渲染 | scene.render.use_freestyle = True,line_thickness px。速度最慢,可选项最多 |
反转外壳的已知局限:相交处和内部折痕处不会生成线条(渲染时可用 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 卡通着色器、Godot ShaderMaterial),并使用相同的太阳方向驱动。将外壳作为第二个材质槽导出(应用修改器),或将其命名为 NPR_OutlineNormal,用于着色器描边通道。
对于 glTF 中无光照的纯色资源,使用 Background 着色器,或使用 Light Path Is Camera Ray 将 Transparent 与 Background 混合:两者都会导出为 KHR_materials_unlit。发光会导出为黑色底色上的自发光,而非无光照材质(实测如此)。
注意事项
- 在使用
--outline前应用缩放:Solidify 厚度是在对象空间中计算的。 - 泛光和 AO 会破坏扁平风格。保持世界环境昏暗且均匀,并使用一盏主光,视情况再加一盏轮廓光。
--lighting scene的色阶会随光照能量变化(亮度 0.3 ≈ 阈值 0)。请调高/调低--threshold,而不是调整光照强度。
评论
支持 Markdown