スプライトシートのノーマルマップ · フレームごとに生成
ノーマルマップ生成ツールをスプライトシート全体にかけると、アニメーションではなく1枚の絵として扱われます。近くに並んだフレーム同士でぼかしや縁からの距離が混ざり、同じポーズでも隣のフレーム次第で立体感が変わります。ここではまずスプライト作業画面でフレームを切り、テクスチャ作業画面が各フレームを同じpx設定で個別に処理するので、再生中も立体感がぶれません。

- Godot 4 2D lights検証済み· Godot 4.7.2
- Unity 6 URP 2D検証済み· Unity 6000.5.3f1 (URP 17.5)
- PNG set + JSON通常ファイル
できること
- フレームはスプライト作業画面(「適用」)から。テクスチャ作業画面は自分ではフレームを切らず、フレームのないシートは1枚の絵として照らします。
- 距離変換・ぼかし・カーネルはフレームの境界を越えて読みません。tests/normals.test.mjsで、フレームのマップが隣と無関係で、スプライトと一緒に動くことを確認。
- ベベルの幅・深さ・ディテールは絶対px値で、フレームごとに調整し直しません。128px以下のドット絵フレームには1.5pxの縁を提案。
- ライトの位置はフレームのpx基準なので、全フレームが同じように照らされます。Enterでライト付き再生、`でシート全体と1フレーム表示を切り替え。
- 高さブラシ(B)の1ストロークは始めたフレームの中にとどまり、取り消しは1回単位。
使い方
- スプライトシートをドロップすると、スプライト作業画面で開きます。
- グリッドとアニメーションを確認して「適用」。
- テクスチャタブを開くと、全フレームのノーマルマップがすぐに生成されます。
- ベベルとディテールを調整し、ライトツール(L)で光を置いてEnterでライト付きのアニメーションを確認。
- 書き出し(Ctrl+E)でGodot 4、Unity 6 URP 2D、PNGセットから選ぶ。
シート一括処理とフレームごとの処理
| シート全体を一度に | フレームごと(この作業画面) | |
|---|---|---|
| フレーム境界付近のベベル | 縁からの距離が隣のフレームに届くことがある | 各フレームの中だけで測る |
| ぼかしとディテール | 隣のフレームへにじむことがある | フレーム境界で止まる |
| 2つのフレームにある同じ絵 | 立体感が変わることがある | 同じ立体感、スプライトと一緒に移動 |
| ライトの位置 | シートのpx基準:位置の違うフレームは照らされ方も違う | フレームのpx基準:全フレームが同じように照らされる |
| 書き出し | ノーマルマップ画像1枚、エンジン設定は手作業 | AnimationPlayer付きのGodotシーン、Unityのスプライト範囲+_NormalMap |
エンジン別の書き出しと検証方法
「検証済み」は、実際の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 2D | PNG · 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 + JSON | albedo · _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のものです。
よくある質問
シート全体で1枚のノーマルマップを作るのではだめ?
フレームが接していたり近かったりすると、シート全体を一度に処理したときにぼかしや縁からの距離が隣のフレームへはみ出し、同じ絵でも隣次第で立体感が変わってアニメーションがちらつきます。フレームごとに処理すれば、シートのどこにあっても同じ結果になります。
Godotへの書き出しでアニメーションも再生されますか?
はい。<名前>_lit.tscnにはCanvasTextureを使うSprite2D、環境光のCanvasModulate、ライトごとのPointLight2D、フレームを切り替えるAnimationPlayerが入っています。Godot 4.7.2の描画は、そのAnimationPlayer経由も含めて確認した全フレームでStudioの基準と1/255以内で一致しました。
Unityでは?
Unity 6 URP 2DのバンドルはJSONからスプライトの範囲を設定し、ノーマルマップを_NormalMapのセカンダリテクスチャ(リニア、非圧縮、リサンプルなし)として付けます。Unity 6000.5.3f1で12回すべて合格し、明るさのカーブはURP自身のものです。
無料ですか?アカウントは必要ですか?
このページの機能はすべて無料で、アカウントなしで使えます。透かしや制限された書き出しはありません。
スプライトはアップロードされますか?
いいえ。Studioはこのブラウザのタブ内でデコード・パック・書き出しを行います。プロジェクトはブラウザ(IndexedDB)に自動保存され、.nerulioファイルとして保存できます。
Asepriteやエンジンのプラグインは必要ですか?
いいえ。.asepriteファイルはブラウザで読み書きします。エンジン別のバンドルには必要なものが入っています(Godotはインポート設定とシーン、UnityとGodotのタイルセットは小さなエディタースクリプト)。