mcpField
B
blender-stylized-npr

blender-stylized-npr

github.com/el4cteo创意与媒体1.1k302 次安装今天更新
代码仓库

关于 blender-stylized-npr

为 Blender 创建 NPR 卡通着色与轮廓效果的技能,面向制作风格化角色和场景的艺术家。它通过脚本配置色阶、光照、边缘光及多种描线方式,并支持还原材质改动。

主要功能

  1. 01配置卡通色阶与阴影色
  2. 02设置边缘光和高光
  3. 03支持倒壳与 Line Art 描线
  4. 04生成引擎轮廓用法线数据
  5. 05记录并还原原始材质连接

适用场景

  1. 01为角色制作动漫风格明暗
  2. 02为模型添加轮廓线
  3. 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