本文へスキップ

Godot ノーマルマップ · 2Dライト付きシーンで書き出し

Godot 4の2Dノーマルマップは、入れただけでは何も変わりません。CanvasTextureに入れたうえで、高さのあるLight2Dがスプライトを照らす必要があります。テクスチャ作業画面はノーマルマップを作り、Godotのキャンバスレンダラーと同じ式でライティングを確認し、スプライト・ライト・環境光・フレームがそろったシーンを書き出します。Godot 4.7.2での描画とプレビューの差は1/255以内でした。

スプライト、スプライトシート、繰り返しテクスチャ(PNG)をドロップ
空のStudioを開く
ブラウザ内で処理し、ファイルはアップロードされません。
Studio のテクスチャ作業画面:6フレームに切ったドット絵のたいまつを、生成したノーマルマップと点光源で照らした画面
CC0アセット(OpenGameArt)を開いた実際のStudio画面です。
書き出し先
  • Godot 4 2D lights検証済み· Godot 4.7.2
  • Unity 6 URP 2D検証済み· Unity 6000.5.3f1 (URP 17.5)
  • PNG set + JSON通常ファイル

できること

  • <name>_lit.tscn:CanvasTexture(ディフューズ+法線)をテクスチャにしたSprite2D、環境光の色を担うCanvasModulate、ライトごとのPointLight2D、切り分けたシートならregion_rectをフレームごとに動かすAnimationPlayer。
  • 各PointLight2Dには、そのライトの減衰(smooth・linear・quadratic・none)がテクスチャとして入り、色・強さ・高さ(ピクセル単位のz)もそのまま反映。
  • 自分のSprite2D用の<name>_canvas_texture.tres。スペキュラーを0より大きくすると、スペキュラーマップとspecular_shininessが追加されます。
  • ライティング表示はGodotのキャンバスライトの式(基本色×環境光+減衰×ライト×強さ×(基本色×N·L+スペキュラー))そのもの。WebGL2の表示はCPUの基準計算と1/255以内で一致。
  • ポイントライトは最大8個。リムライトはカスタムシェーダーなしではGodotが描かないため、プレビュー専用です。

使い方

  1. スプライトかシートをドロップ(シートは先にスプライト作業画面で切り分けるとフレームが動きます)。
  2. 法線マップパネルでベベルとディテールを確認し、高さブラシ(B)で凹凸を調整。
  3. Lキーでライトを置き、高さ・強さ・減衰を決め、ライティング表示でEnterを押して再生。
  4. 書き出し(Ctrl+E)でGodot 4にチェック。
  5. godotフォルダーをres://以下の好きな場所にコピーし、<name>_lit.tscnを開く。

Godot用バンドルの中身

ファイル・ノード内容ゲーム側ですること
<name>_lit.tscnのSprite2Dテクスチャ=CanvasTexture、region有効、ドット絵ならNearestフィルターシーンをインスタンス化するか、テクスチャだけ自分のスプライトへ
<name>_canvas_texture.tresdiffuse_texture、normal_texture、必要ならspecular_textureとspecular_shininess同じシートを描くSprite2Dで再利用
PointLight2D(ライトごとに1つ)フレームのピクセル基準の位置、color、energy、height=z、減衰PNGのテクスチャ、半径から求めたtexture_scale1つをたいまつとして残し、ほかは削除するか値をレベルのライトへ
CanvasModulate「Ambient」環境光の色レベルに1つだけ置く(キャンバス全体に色が乗る)
AnimationPlayerタグごとに1アニメーション、各フレームの開始にregion_rectのキー、タグどおりにループスクリプトからタグ名でplay()
PNGファイル<name>.png、<name>_n.png(OpenGL)、スペキュラーマップ、使った減衰ごとのPNGシーンと同じ場所に置く(相対パス)

リムライトは書き出しません(プレビュー専用)。フォルダー内のREADMEにも検証状況を記載しています。

エンジン別の書き出しと検証方法

「検証済み」は、実際のCC0アセットから書き出したファイルを本物のエンジン・ツールで読み込み、元データと比較したという意味です。読み込んでいない形式はそのように表示します。

書き出し先ファイル検証
Godot 4 2D lights_lit.tscn · CanvasTexture .tres · normal / specular PNG検証済み Godot 4.7.2実在のCC0ケース6件をGodot(gl_compatibility)で描画し、確認した全フレームがStudioのライティングプレビューと1/255以内で一致。緑を反転した同じ描画は3.8〜37段階ずれるため、規約の誤りを検出できます。
Unity 6 URP 2DPNG · nerulio-texture.json · Editor/NerulioNormalMapImporter.cs検証済み Unity 6000.5.3f1 (URP 17.5)12回中12回合格(6ケース×ガンマ・リニア色空間):URPが適用したライティングが書き出したノーマルマップと一致(平均誤差0.0037〜0.0085)。光の減衰はURP独自なので、明るさはプレビューではなくUnityの基準です。
PNG set + JSONalbedo · _n (OpenGL) · _n_dx (DirectX) · 16-bit height · AO · specular · manifest通常ファイルどのエンジン・ツールでも使える通常ファイルで、エンジンでの実行検証はうたっていません。

検証の根拠

Godot 4.7.2で実在のCC0ケース6件(ドット絵、HDスプライト、繰り返しテクスチャ、読み込んだDirectXマップ)を描画し、確認した全フレームがStudioのプレビューと1/255以内。Unity 6000.5 URP 2D:12回中12回合格(6ケース×ガンマ・リニア)。規約が分かっている実在のマップでOpenGL/DirectX判定:1Kのマップ128枚で100%正解、1,562サンプル中で誤った「高」判定は0件(「緑が明るければOpenGL」という単純な規則は46%)。

制限

  • 透明な縁がない絵(繰り返しテクスチャ)では、赤の反転とDirectXの緑を区別できません。チェックパネルがそれを伝え、「赤を反転」を用意しています。
  • シートはスプライト作業画面でフレームを切るまで1枚の絵としてライティングされます。テクスチャ作業画面ではフレームを切りません。
  • リムライトはプレビュー専用で、Unityにはスペキュラーマップを書き出しません(Godotには書き出し)。
  • Unityは独自の光の減衰を使います。書き出したノーマルマップはUnityで検証済みですが、明るさの曲線はUnityのものです。

よくある質問

Godot 2Dでノーマルマップが効きません。何が足りない?

多くは次の3つのどれかです。ノーマルマップがCanvasTextureのnormal_textureに入っていない、スプライトまで届くLight2Dがない、ライトの高さが0のままで横から当たっている。書き出したシーンは3つとも設定済みなので、自分のノードと見比べてください。

AnimatedSprite2Dを使いますか?

いいえ。Sprite2Dを使い、AnimationPlayerがシート上のregion_rectを動かします。1つのCanvasTextureが全フレームの法線を持ちます。検証でGodot 4.7.2が描画したのもこの構成で、AnimatedSprite2Dの構成は確認の対象外です。

どのレンダラーと素材で確認しましたか?

Godot 4.7.2のCompatibilityレンダラー(gl_compatibility)で、実在するCC0素材6件:ドット絵のたいまつ(スペキュラーあり・なし)、60フレームの侍、80×110の冒険者、タイル状のレンガ、読み込んだDirectXノーマルマップ。確認した全フレームが1/255以内で、緑を反転した描画は3.8〜37段階ずれました。

Godotでも明るさはプレビューと同じですか?

はい。各ライトにStudioの減衰カーブがテクスチャとして入るので曲線が同じで、検証も最終的なライティング後のピクセルで比較しています。UnityはURPが独自の減衰を使うため異なります。

無料ですか?アカウントは必要ですか?

このページの機能はすべて無料で、アカウントなしで使えます。透かしや制限された書き出しはありません。

スプライトはアップロードされますか?

いいえ。Studioはこのブラウザのタブ内でデコード・パック・書き出しを行います。プロジェクトはブラウザ(IndexedDB)に自動保存され、.nerulioファイルとして保存できます。

Asepriteやエンジンのプラグインは必要ですか?

いいえ。.asepriteファイルはブラウザで読み書きします。エンジン別のバンドルには必要なものが入っています(Godotはインポート設定とシーン、UnityとGodotのタイルセットは小さなエディタースクリプト)。