mcpField
S
scenario-blender-lighting-rendering

scenario-blender-lighting-rendering

github.com/scenario-labs创意与媒体1.2k438 次安装1 天前更新
代码仓库

关于 scenario-blender-lighting-rendering

面向使用 Blender 制作场景和角色的创作者,提供灯光、渲染与合成的专业工作流,并配有测量和审查工具。其重点是按画面效果调整灯光,而非只看灯具参数。

主要功能

  1. 01基于主体与相机布置灯光
  2. 02提供 EEVEE 与 Cycles 预设
  3. 03分析渲染与明暗层次
  4. 04在合成器中调整灯光组
  5. 05检查色彩设置与渲染质量

适用场景

  1. 01为室内场景设置有动机的灯光
  2. 02区分主体与背景的明暗层次
  3. 03在 Cycles 渲染后重新平衡灯光
  4. 04检查动画镜头间的灯光一致性

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/scenario-labs/skills --skill scenario-blender-lighting-rendering

安装后在 Claude Code 中输入/scenario-blender-lighting-rendering确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
critique.md
expert-notes.md
procedures.md
sources.md
scripts/
bx_light.py

详细介绍

灯光、渲染与合成

专业的灯光控制决定观众的视线落在哪里。形体来自渐变;通过明度(在去饱和状态下检查)让主体与环境分离;每盏灯都要有光源依据和明确用途;所有决策都要根据渲染效果衡量,而不是看灯光参数。从可控的基础设置开始,一次只改一项,并进行对比。如果这里提到的某个同级技能不在你可用的技能中,请让用户安装它(npx skills add scenario-labs/skills --skill <name>);若需无人值守地继续,请根据工具架构定义推进,并标明缺失项。

必备背景: scenario-blender-expert(执行通道、审核循环、5.2 API 变更)。 相关技能:scenario-blender-texturing-shading(材质、皮肤次表面散射),scenario-blender-previs-storyboard(镜头规划、摄像机)。

工具包:scripts/bx_light.py(已在 5.2.1 上测试):相对于主体和摄像机布置灯光架、EEVEE/Cycles 预设、色彩设置与审查、5.x 合成器辅助工具、渲染分析。导入:sys.path.append("<this skill>/scripts"); import bx_light as BL。

核心原则(专家经验)

  • 先确保明度分离。 Andy Goralczyk 几乎在每个镜头中都通过明度将角色与背景分离,并会检查去饱和效果。Andrew Price 指出:对比度最高的区域无论你是否愿意,都会成为视觉焦点(明亮的窗户会压过沙发)。应先调暗场景,再提亮主体。
  • 控制光源大小和距离。 Andrew 指出:大光源能表现形体并隐藏毛孔,小光源则能表现纹理和粗粝感,因此面部主光应使用大光源,而不是小灯泡(卡通风格或刻意追求强烈效果时除外)。平方反比规律是引导注意力的工具:靠近灯光,而不是增加辅助灯。主光与补光的比例没有固定规则(Andrew:“主光的一半这种说法毫无根据”):调暗阴影面,直到它看起来像阴影但仍保留细节,并以主体上的效果为准。
  • 先明确光源依据,再合理地作弊。 每盏灯都需要一个来自环境的光源依据和颜色(Gleb Alexandrov、Lino Thomas)。Andy 会把轮廓光放在主光一侧,因为放在阴影侧会像是来自虚无的反弹光。当光源位于主体后方时,他会伪造一束照向面部的主光。通过投射阴影和灯光链接,避免这些作弊影响场景。Gleb 会在图像“看起来像打了灯”之前停手。
  • EEVEE 就像风衣,能遮掩很多问题(Andrew)。 在工厂场景中,光线追踪默认关闭。世界光会穿过墙壁,除非体积探针的外层采样点贴近内墙(Andrew;实测漏光从 0.26 降至 0.002;5.2.1 会将采样点放在盒子内侧一个间距处,因此要根据采样点确定盒子尺寸)。柔和灯光需要为每盏灯启用抖动(Gleb)并设置自定义距离(实测:自动距离会损失 8%)。
  • Cycles 节约原则(Andy,Sprite Fright): 3 次反弹、不启用焦散、不钳制、使用 Fast GI,并通过灯光伪造反弹光。只在眼睛和主角金属上保留锐利高光。
  • 保持线性和宽色域,直到最后一步(Jacob Holiday)。 EXR 保持线性,而 PNG 会烘焙视图变换。AgX 会隐藏剪切(线性值 4 显示为 0.91),因此要查看 EXR。全局亮度应在视图变换中通过 exposure 调整,而不是缩放灯光(这样可以保持所有比例,包括世界光和自发光)。场景使用 AgX,产品颜色使用 Khronos PBR Neutral。一次性设置好工作色彩空间(Nathan Vegdahl)。
  • 在合成中重新平衡,而不是重新渲染(Wyatt、Robin)。在 Cycles 中按作用划分灯光组(主光、补光、轮廓光、窗光):只渲染一次,然后在合成器中调整增益(BL.light_groups、BL.lightgroup_mix)。EEVEE 没有灯光组输出:应使用灯光链接和视图层。
  • 始终进行轻量合成(Pau Homs): 添加泛光、暗角,再进行校正;在效果显得像滤镜之前停手。在 5.x 中,合成器采用节点组。
  • 色彩有三种对比(Lino): 明度、饱和度和色相。保留一种高饱和的焦点色相,并让其互补色在大面积区域中去饱和。

先确定

输入对方案的影响未说明时的默认值
静帧或动画连贯性、闪烁和时域降噪静帧
引擎EEVEE:风格化、快速迭代、体积效果、NPR、使用通道进行视口合成。Cycles:玻璃特写、反弹光照真实感、参考使用 EEVEE 迭代,并额外渲染一张 Cycles 参考图
风格卡通明暗交界线需要小而稳定的主光风格化写实
主体和焦点绑定目标(面部)、分析用蒙版角色头部,否则为边界框中心
时间和动机配色方案:暖色实用灯光、冷色天空、太阳夜晚/黄昏室内:暖色主光(已添加 2,700 K),冷色补光
交付PNG 预览图加 EXR 母版;是否需要外部调色?PNG + 32 位多层 EXR
色彩保真度品牌 RGB:Khronos PBR Neutral;肤色:ACES 2.0 或 AgX High ContrastAgX
后期调整平衡、合成移交按角色划分 Cycles 灯光组、多层 EXR使用 Cycles 渲染时启用分组

工作流

  1. 构图,然后锁定相机。 光照取决于视角(Andrew)。使用 BL.screen_xy 和 BL.aim_camera_at_frame_point(head, 1/3 or 2/3, 0.62) 留出视线空间,方正的 产品使用 80 mm。关卡:只有一个焦点元素;主体靠近三分线交点,或采用刻意的对称、金字塔式构图或满画幅构图。
  2. 控制基础环境。 对于摄影棚:将世界强度设为 0,并使用近乎纯黑的粗糙地面(Andrew)。对于 EEVEE 室内场景:pb = BL.volume_probe_for_room(inner_lo, inner_hi, cell=0.5, wall=0.2)(在内墙上进行外部采样),然后运行 BL.probe_report(pb, inner_lo, inner_hi),再运行 BL.bake_probes()。 对于室外场景:BL.outdoor_sun_sky(..., azimuth_space="world")。关卡:probe_report 不报告任何问题,且密闭室内场景仅使用世界光照渲染时接近全黑。
  3. 主光。 使用 BL.three_point、BL.motivated_interior(窗光 + 实用光源、模拟关联主光、聚光实用光源、轮廓光、反弹光)或 BL.outdoor_sun_sky。灯光会自动避开墙面。 关卡:BL.light_report(target=head, face=head) 没有标记(正面主光、主光低于眼线、主光小于头部),且黏土渲染(BL.clay(True))的 internal_ratio >= 2.5。
  4. 辅助灯光。 根据需要添加补光、轮廓光、反弹光和 BL.eye_light,以及 BL.shadow_caster、BL.fake_sun、BL.split_world 或 BL.haze。关联设置在灯光 OBJECT 上(obj.light_linking,通过 BL.link_light),而非 Light 数据块上。每次调整一盏灯: 使用 BL.light_contributions(lights, mask, dir),或在 Cycles 中从一次渲染结果运行 BL.lightgroup_check(exr, mask)。关卡:主光在主体上的占比最大;室内场景中世界光照占比低于 10 %;每一道轮廓光都有合理依据。
  5. 测量并检查效果。 r = BL.render(base) 会生成 PNG + EXR。然后运行 mask = BL.mask_cryptomatte(r["exr"], names)(或 BL.mask_workbench), rep = BL.analyse(r["png"], mask, exr=r["exr"])、BL.verdict(rep) 和 BL.value_study(...), 并打开图像。关卡:判定结果为空,且主体在明暗研究中占据一个明度组;否则调暗布景、用聚光灯或遮光板塑造轮廓,并关联主光。
  6. 色彩。 使用 BL.color_setup(view, look, exposure)(在此处调整亮度,切勿通过调整灯光缩放来改变亮度),并运行 BL.color_audit()。关卡:审计结果为空;没有标记互补色冲突;发光体以外的剪切不超过 0.5 %;线性最大值符合预期。
  7. 渲染设置。 使用 BL.preset_eevee(quality="final", interior=...) 或 BL.preset_cycles(quality="final", budget="film")。对于 EEVEE 最终渲染,先渲染一张 Cycles 预览作为参考(Andrew)。关卡:主体效果与 Cycles 的差异约在 30 % 以内,且没有渲染引擎伪影(评审部分第 7 节)。
  8. 合成。 Cycles:mix = BL.lightgroup_mix(gains, exr=r["exr"]) 可在约 0.2 s 内基于 EXR 重新调整主光、补光、轮廓光和窗光的色调(BL.set_gain,RGB 增益可重新着色)。然后运行 BL.comp_finish(bloom=0.25, vignette=0.3, contrast=0.05, source=mix["socket"]);使用 BL.matte(tree, names) 创建遮罩;像素尺寸通过 BL.relative_px 设置;通道、返回 beauty 和视图图层见流程 P13。关卡:对处理完成的画面重新运行判定;暗角比率应有所下降。
  9. 交付并附上证据: 最终 PNG、EXR、明暗研究、灯光表、判定结果,以及尚未验证的内容。

动画: 根据拍摄地点,使用 sun_azimuth 固定太阳方位,偏差控制在约 30 deg 以内(Andy)。先布置广角镜头的光照,再将其应用于各覆盖镜头。使用 BL.contact_sheet 和 BL.sheet_stats 检查镜头(识别与中位数相差超过 0.5 档的异常值)。保持时间降噪开启,绝不要使用 1/16 光线追踪分辨率。

数值

数值相对于来源
白色卡片的亮度等级:点为 P/(4π²d²),面积为 P/(π²d²),太阳为 S/πBL.energy_for实测,两种引擎均适用
与距离一样大的光源,其光照可达到标称亮度等级的 75 %视角大小实测
AgX 显示:0.18 映射为 0.463,1.0 映射为 0.773,4.0 映射为 0.910线性值实测
主光与轴线呈 40 度角、向上 35 度、距主体 3 个主体半径;大小 = 半径主体、相机[added] 默认值
正面旗板:主光与相机轴线的夹角 < 20 度相机轴线[added]
太阳角度约为 2 度;连续性 ±30 度布景Andy
开尔文值:烛光 1,500,白炽灯 2,000 至 2,500,日光 6,500(实用默认值为 2,700 [added])光源Andrew
EEVEE:最终渲染使用 RT 1:1 和 GI 1:2;Fast GI 步数 16,阴影步数 12 至 16(可能漏光),阴影射线数 2(半影)渲染Andrew
体积探针:外侧采样点位于内墙上(采样点位于局部坐标 (i+1)/(N+1)x2-1);漏光量:内移 0.44 m 时为 0.22,内移 0.2 m 时为 0.054,墙面处为 0.002,墙外为 0.009;表面元素密度为 100房间Andrew,实测
品牌颜色误差(以 255 为基准):Khronos 为 3.8,AgX 为 27 至 42,Standard 为 33白炉实测
房间的雾气密度约为 0.05体积Andrew
Cycles 胶片:3 次反弹,clamp 为 0,不使用焦散;测试使用 100 个采样,最终渲染使用 500 至 1,500 个采样渲染Andy
EXR:多层、半精度浮点,合成使用 DWAA;母版使用 32 位输出Robin,Andy
判定标准:环境分离度 ≥ 0.10,边缘融合度 ≤ 35 %,灰模形态比 ≥ 2.5,值域 ≥ 0.30,裁切 ≤ 0.5 %显示亮度[added],已校准

质量门槛

可衡量:

rep = BL.analyse(png, mask, exr=exr); problems = BL.verdict(rep)          # [] = pass
flags = BL.light_report(target=head, face=head)["flags"]; audit = BL.color_audit()
probe = BL.probe_report(pb, inner_lo, inner_hi)["flags"]                  # EEVEE interiors: []
groups = BL.lightgroup_check(exr, mask)                                   # Cycles: rel_error ~0, shares
shares = BL.light_contributions(lights, mask, out_dir)                   # per-light share on subject

视觉检查:打开渲染结果、value_study 面板(去饱和 | 明度分组 | 眯眼观察),以及序列的联系表。根据 references/critique.md 进行评判: 第一印象、明度结构、形体、动机、色彩、构图、瑕疵、完成度。

常见错误

错误表现修复
正面主光画面平淡、“闪光灯照片”感,黏土形体比例约为 1.3主光与轴线成 30 至 60 度,并高于视线
将主体后方的实景灯用作主光面部暗淡,明亮的墙面抢走焦点在光源一侧设置偏置主光,并与主体关联
靠近墙面的裸露点光源实景灯墙面过曝,架子成为视觉焦点使用灯罩光锥形状的聚光灯;添加遮光板
EEVEE 室内场景未使用探针,或探针盒边界贴着墙面阴影处处泛蓝/灰,画面浑浊在内墙处放置外围采样点(probe_report),烘焙,并进行密闭房间测试
用小灯泡作为面部主光毛孔和纹理明显,面部生硬使用大型光源(至少与头部一样大);在 light_report(face=) 中标记
通过缩放灯光来提亮世界光和自发光未同步调整,比例失衡在视图变换中调整 exposure
light.data.light_linkingAttributeError光照关联和灯光组是对象属性
重新渲染以重新平衡灯光每次微调都要耗费数小时使用 Cycles 灯光组 + lightgroup_mix
将绑定灯光放在墙内轮廓光毫无作用使用 avoid=subject(绑定中的默认值)
主光未关联而是伪造的主体变亮时布景也随之变亮,缺乏分离感设置 link_key=True;主光占比要高,背景占比接近 0
根据 AgX PNG 判断是否过曝高光看起来正常,但 EXR 达到 20+检查 linear_max,使用 exposure
卡通材质使用大型柔和抖动主光终止线出现抖色和噪点NPR 使用小型无抖动主光(Wyatt:卡通着色使用清晰阴影)
反转的外壳轮廓线角色变暗或显得扁平轮廓材质对阴影光线透明(outline_hull)
仅在着色器中命名 AOV渲染通道悄然缺失使用 BL.register_aovs()
像素尺寸的合成效果预览和最终效果不一致使用 BL.relative_px
图层中使用排除而非仅间接光照合成中缺少阴影使用 indirect_only(差值为 0.0004,而非 0.016)

Blender 5.2 说明

  • EEVEE 的 ID 为 BLENDER_EEVEE;use_raytracing 默认值为 False; use_bloom/ssr/gtao/soft_shadows 已移除(Glare 节点、光线追踪、Fast GI、每盏灯的抖动)。
  • 探针类型为 SPHERE/PLANE/VOLUME;无头模式下,lightprobe_cache_bake 会同步运行;球形探针的默认值为 512。体积采样点位于包围盒各面的内侧一个间距处,不会落在面上。
  • EEVEE 会写入 Cryptomatte,但没有 Object Index 通道;灯光组仅适用于 Cycles(EEVEE Render Layers 没有 Combined_<group>);灯光链接在两种引擎中都可用。light_linking 和 lightgroup 是 Object 属性;bpy.types.Light 两者都没有。
  • 合成器:scene.compositing_node_group、Group Output、ShaderNodeMix(颜色插槽 6/7,结果插槽 2),菜单输入接受显示名称('Bloom')。GPU 是默认设备。资源位于 datafiles/assets/nodes/compositing_nodes_essentials.blend。
  • 颜色:工作空间为只读(使用 bpy.ops.wm.set_working_color_space);外观名称带有前缀('AgX - Punchy');'Linear'/'Raw' 会被拒绝;支持摄影机对数空间;Principled Thin Wall 可用于窗户玻璃。
  • 设置变换后,matrix_world 会过期;请调用 view_layer.update()。OIIO 的 read_image(subimage, ...):第一个参数用于选择部分。

参考资料

  • references/procedures.md:涵盖各阶段的已测试代码(P1 单位至 P17 曝光和颜色),并附有测量结果和测试路径。编写代码前请先加载。
  • references/critique.md:用于评判渲染或序列的评分标准,按专家阅读顺序排列,并为每个问题提供对应的代码检查。
  • references/expert-notes.md:各位专家的原则及时间戳,以及意见分歧表。用于需要判断和注明出处时,请先加载。
  • references/sources.md:15 个视频、凭据、最佳时间戳,以及针对不同问题应参考哪些视频。

评论

支持 Markdown