关于 scenario-blender-lighting-rendering
面向使用 Blender 制作场景和角色的创作者,提供灯光、渲染与合成的专业工作流,并配有测量和审查工具。其重点是按画面效果调整灯光,而非只看灯具参数。
主要功能
- 01基于主体与相机布置灯光
- 02提供 EEVEE 与 Cycles 预设
- 03分析渲染与明暗层次
- 04在合成器中调整灯光组
- 05检查色彩设置与渲染质量
适用场景
- 01为室内场景设置有动机的灯光
- 02区分主体与背景的明暗层次
- 03在 Cycles 渲染后重新平衡灯光
- 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.mdexpert-notes.mdprocedures.mdsources.mdscripts/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 Contrast | AgX |
| 后期调整平衡、合成移交 | 按角色划分 Cycles 灯光组、多层 EXR | 使用 Cycles 渲染时启用分组 |
工作流
- 构图,然后锁定相机。 光照取决于视角(Andrew)。使用
BL.screen_xy和BL.aim_camera_at_frame_point(head, 1/3 or 2/3, 0.62)留出视线空间,方正的 产品使用 80 mm。关卡:只有一个焦点元素;主体靠近三分线交点,或采用刻意的对称、金字塔式构图或满画幅构图。 - 控制基础环境。 对于摄影棚:将世界强度设为 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不报告任何问题,且密闭室内场景仅使用世界光照渲染时接近全黑。 - 主光。 使用
BL.three_point、BL.motivated_interior(窗光 + 实用光源、模拟关联主光、聚光实用光源、轮廓光、反弹光)或BL.outdoor_sun_sky。灯光会自动避开墙面。 关卡:BL.light_report(target=head, face=head)没有标记(正面主光、主光低于眼线、主光小于头部),且黏土渲染(BL.clay(True))的internal_ratio >= 2.5。 - 辅助灯光。 根据需要添加补光、轮廓光、反弹光和
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 %;每一道轮廓光都有合理依据。 - 测量并检查效果。
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(...), 并打开图像。关卡:判定结果为空,且主体在明暗研究中占据一个明度组;否则调暗布景、用聚光灯或遮光板塑造轮廓,并关联主光。 - 色彩。 使用
BL.color_setup(view, look, exposure)(在此处调整亮度,切勿通过调整灯光缩放来改变亮度),并运行BL.color_audit()。关卡:审计结果为空;没有标记互补色冲突;发光体以外的剪切不超过 0.5 %;线性最大值符合预期。 - 渲染设置。 使用
BL.preset_eevee(quality="final", interior=...)或BL.preset_cycles(quality="final", budget="film")。对于 EEVEE 最终渲染,先渲染一张 Cycles 预览作为参考(Andrew)。关卡:主体效果与 Cycles 的差异约在 30 % 以内,且没有渲染引擎伪影(评审部分第 7 节)。 - 合成。 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。关卡:对处理完成的画面重新运行判定;暗角比率应有所下降。 - 交付并附上证据: 最终 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_linking | AttributeError | 光照关联和灯光组是对象属性 |
| 重新渲染以重新平衡灯光 | 每次微调都要耗费数小时 | 使用 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 个视频、凭据、最佳时间戳,以及针对不同问题应参考哪些视频。