概要
ベタ塗りのドット絵に1ノードで光と影をつける入門シェーディングノードです。 高さマップも法線も不要で、シルエットから立体を自動推定します。 「まず立体感を試したい」「量産素材にサッと陰影を足したい」ときの最短ルートです。
使い方のポイント
- まずは
画像 → かんたん陰影とつなぐだけ。既定(左上光・くっきり2段)で ドット絵らしい仕上がりになる volumeは絵の性格で選ぶ: キャラ・スライム→Round、結晶・トゲ→Sharp、 レンガ・タイル→Flat- 陰影の段数は素材サイズで決める: 16〜32px→
Steps2、48px以上→Steps3。Smoothはドット絵的でなくなるので演出用 光の向きを変数にバインドしておくと、シーン内の全素材の光源方向を一括変更できる- 物足りなくなったら卒業ルートがある:
height出力をimage_to_surfaceにつなげば、 ライティング定義・パレットスナップが使える本格Surface経路に移行できる
よくある失敗
- 内部のディテールに影が付かない: シルエットからの推定なので、絵の中の段差は 立体として扱われない(下記「限界」)。内部段差が要るなら Surface 経路へ
- 明るすぎる/白飛びする:
intensityを下げるかambientとのバランスを取る。 ambient は「影側に残す最低の明るさ」 - 光が思った方向から来ない:
angleは315が左上(ドット絵の定番)。elevation90 は真上からの照明になり、向きの効果が消える
技術詳細
内部処理は次の3段で、すべて既存の共有基盤を使う薄いラッパー:
pxn_core::height_field::height_from_silhouette()— アルファシルエットの距離変換で高さマップを推定- 推定高さを
SurfaceDocumentに包む surface::render_surface_light()—サーフェース光プレビューと同じレンダラで光を当てる
shading_styleの Steps2/Steps3 は拡散光を段階に量子化し(SurfaceLightSettings::diffuse_steps)、OKLCH 段階トーンも合わせて適用する- 落ち影(キャスト)はシルエット由来の高さではノイズになりやすいため無効
- angle の意味は
サーフェース光プレビューと同一(315 = 左上からの光)
使用例
画像読み込み → かんたん陰影だけでスプライトに立体感がつく光の向きを変数にバインドすれば、複数スプライトの光源方向を一括変更できる- 細かく制御したくなったら
height出力を画像からサーフェースにつなぎ、サーフェース光プレビュー側でライティング定義・パレットスナップを使う
限界
シルエットだけから立体を推定するため、絵の内部の段差(窓のくぼみ等)は反映されない。その場合は 画像から高さマップ の明るさモードや手描き高さマップで Surface 経路を使う。
関連ノード
height_from_image— 高さ推定を単独で行い、細かく制御したい場合image_to_surface+surface_light_preview— 本格ライティングへの卒業ルートdrop_shadow— 立体感ではなく「落ち影」が欲しい場合gradient_map— 陰影を自分で塗り分ける伝統的アプローチ