scenario-blender-lighting-rendering について
Blenderでライティング、レンダリング、コンポジットを行う制作者向けのスキルです。照明器具の数値だけでなく、レンダー画像を測定して調整する手順を備えています。
主な機能
- 01被写体とカメラ基準の照明配置
- 02EEVEEとCyclesのプリセット
- 03レンダーと明度構成の分析
- 04コンポジターでのライトグループ調整
- 05色設定とレンダー品質の監査
活用シーン
- 01室内シーンの光源を設定
- 02被写体と背景の明度差を調整
- 03Cyclesレンダー後の照明バランス調整
- 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(マテリアル、肌の SSS)、 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 では役割ごと(キー、フィル、リム、ウィンドウ)にライトグループを分けます。1 回のレンダーの後、コンポジターでゲインを調整します(
BL.light_groups、BL.lightgroup_mix)。EEVEE にはライトグループの出力がないため、ライトリンクとビュー レイヤーを使います。 - 常に軽くコンポジットします(Pau Homs): ブルーム、ビネット、補正の順に加え、フィルターをかけたように見える前に止めます。5.x ではコンポジターはノードグループです。
- 色には 3 種類のコントラストがあります(Lino): 明度、彩度、色相です。彩度の高い焦点色はひとつに絞り、その補色は広い領域で彩度を落とします。
まず決めること
| 入力 | プランが変わる理由 | 指定がない場合のデフォルト |
|---|---|---|
| 静止画またはアニメーション | 継続性、ちらつき、時間的なノイズ除去 | 静止画 |
| エンジン | EEVEE:スタイライズ表現、高速な反復、ボリューム、NPR、パスを使ったビューポート合成。Cycles:ガラスのクローズアップ、反射光のリアリズム、リファレンス | 反復にはEEVEEを使用し、Cyclesのリファレンスレンダリングも追加 |
| スタイル | トゥーン表現の明暗境界には、ジッターのない小さなキーライトが必要 | スタイライズされたリアリズム |
| 被写体と注視点 | リグのターゲット(顔)、解析用のマスク | キャラクターの頭部、それ以外はバウンディングボックスの中心 |
| 時間帯と動機 | 配色:暖色の実用光、寒色の空、太陽 | 夜明け/夕暮れの室内:暖色のキーライト(2,700 K [added])、寒色のフィルライト |
| 出力 | 表示用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 を使用します。GATE:焦点となる要素は 1 つにします。被写体を三分割法のポイント付近に配置するか、意図的な 対称構図、ピラミッド構図、またはフルフレームにします。 - ベースを制御します。 スタジオでは、ワールドの強度を 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")を使用します。GATE:probe_reportにフラグがなく、密閉された室内をワールドのみでレンダリングするとほぼ黒になります。 - キーライトを設定します。
BL.three_point、BL.motivated_interior(窓+実用灯、リンクされたキーライトの位置をずらした演出、スポット実用灯、リムライト、バウンスライト)、またはBL.outdoor_sun_skyを使用します。ライトは自動的に壁の外に配置されます。 GATE: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を追加します。リンク設定は Light データブロックではなく、ライト OBJECT に対して行います(obj.light_linking、BL.link_light経由)。ライトは 1 つずつ調整します:BL.light_contributions(lights, mask, dir)、または Cycles では 1 回のレンダリングからBL.lightgroup_check(exr, mask)を実行します。GATE:被写体に対する寄与率が最も高いのはキーライトで、室内ではワールドの寄与率が 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(...)を実行し、画像を開きます。GATE:判定結果が空で、バリュースタディでは被写体が 1 つの明度グループを占めます。そうでなければ、セットを暗くする、スポットライトや遮光板で陰影を作る、キーライトをリンクするなどして調整します。 - カラーを設定します。
BL.color_setup(view, look, exposure)を使用します(明るさはここで調整し、ライトのスケールでは調整しません)。続けてBL.color_audit()を実行します。GATE:監査結果が空で、補色の衝突にフラグが立たず、発光体以外のクリップが最大 0.5 % で、線形の最大値が意図どおりです。 - レンダー設定を行います。
BL.preset_eevee(quality="final", interior=...)またはBL.preset_cycles(quality="final", budget="film")を使用します。EEVEE の最終レンダーでは、Cycles のプレビューを参照用にレンダリングします(Andrew)。GATE:被写体が Cycles から約 30 % 以内に収まり、レンダーエンジンのアーティファクトがありません(批評セクション 7)。 - コンポジットを行います。 Cycles:
mix = BL.lightgroup_mix(gains, exr=r["exr"])は EXR からキーライト/フィルライト/リムライト/窓の光を約 0.2 秒で再グレーディングします(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を使用します。パス、ビューティーパスへの復帰、ビューレイヤーについては手順 P13 を参照してください。GATE:完成フレームで判定を再実行し、ビネット比が下がっていることを確認します。 - 証拠を添えて納品します: 最終 PNG、EXR、バリュースタディ、ライトの表、判定結果、未検証の項目。
アニメーション: 場所ごとに sun_azimuth を約 30 deg 以内にして太陽を固定します(Andy)。ワイドショットをライティングし、その設定を各カバレッジショットに引き継ぎます。BL.contact_sheet と BL.sheet_stats を使ってショットを確認します(中央値から 0.5 stop を超えて外れるものを検出)。時間的デノイズを有効にしたままにし、レイトレーシング解像度 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 倍の距離、サイズ=半径 | 被写体、カメラ | [追加] デフォルト |
| 正面からのフラグ:キーライトはカメラ軸から 20 度未満 | カメラ軸 | [追加] |
| 太陽の角度は約 2 度、連続性は ±30 度 | セット | Andy |
| ケルビン値:ろうそく 1,500、白熱灯 2,000~2,500、昼光 6,500(実用上のデフォルトは 2,700 [追加]) | ライト | 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、クランプ 0、コースティクスなし、テストではサンプル数 100、最終では 500~1,500 | レンダリング | Andy |
| EXR:コンポジット用はマルチレイヤー、ハーフフロート、DWAA;マスターは 32-bit | 出力 | Robin、Andy |
| 判定基準:周囲との分離 ≥ 0.10、エッジの融合 ≤ 35 %、クレイ形状比 ≥ 2.5、値の範囲 ≥ 0.30、クリッピング ≤ 0.5 % | ディスプレイ輝度 | [追加]、キャリブレーション済み |
品質ゲート
測定可能:
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 | リンクとライトグループはObjectのプロパティです |
| ライトのバランスを取るために再レンダリングする | 調整ごとに何時間もかかる | Cyclesのライトグループと lightgroup_mix を使います |
| リグのライトを壁の内側に置く | リムライトが何の効果ももたらさない | avoid=subject(リグのデフォルト)を指定します |
| リンクされていない偽のキーライト | 被写体に合わせてセット全体が明るくなり、分離感がない | link_key=True を指定し、キーライトの比率を高く、背景の比率をほぼ0にします |
| AgX PNGでクリッピングを判断する | ハイライトは問題なく見えても、EXRでは20以上になる | linear_max を読み取り、露出を調整します |
| トゥーンマテリアルに大きく柔らかなジッター付きキーライトを使う | ディザリングが生じ、ターミネーターがノイジーになる | 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 です。ボリュームのサンプルはボックスの面上ではなく、面から間隔 1 つ分内側に配置されます。 - 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 本の動画、認証情報、最適なタイムスタンプ、および質問ごとに参照すべき動画を掲載しています。