本文へスキップ

タイル用ノーマルマップの継ぎ目を消す · ラップ生成

繰り返しテクスチャの境目に沿って明るい線や暗い線が出るのは、たいていノーマルマップを作るときに画像の縁を「端」として扱ったためです。カーネルが反対側のピクセルを読まずに縁で止まり(クランプ)、表面がそのまま続くはずの所に傾きができています。

繰り返すノーマルマップの境目に線が出る原因は、3つのうちどれかです。ノーマルマップを作るときに画像の縁を端として扱った(カーネルが反対側を読まずにクランプした)、色やハイトのテクスチャ自体がタイルになっていない、またはエンジンがテクスチャを繰り返していない、のいずれかです。ラップ(Wrap)の縁でマップを作り、半分ずらしたテクスチャから作ったマップが同一か確かめ、ライトを動かしながら3×3で見てください。NerulioのStudioのテクスチャ作業画面は透明ピクセルのない画像にラップを提案し、縁が内側とまったく同じように計算されていればラップ検査が0を示します。

スプライト、スプライトシート、繰り返しテクスチャ(PNG)をドロップ
空のStudioを開く
ブラウザ内で処理し、ファイルはアップロードされません。
Studio のテクスチャ作業画面:読み込んだambientCGのノーマルマップを高い信頼度でDirectXと判定。規約を確定するまで何も変わらない画面
CC0アセット(ambientCG)を開いた実際のStudio画面です。
書き出し先
  • Godot 4 2D lights検証済み· Godot 4.7.2
  • Unity 6 URP 2D検証済み· Unity 6000.5.3f1 (URP 17.5)
  • PNG set + JSON通常ファイル

継ぎ目ができる理由

ノーマルマップの生成ツールは、各ピクセルの傾きを隣との差から測ります。画像の縁では隣の半分が存在しません。クランプ(Clamp)は代わりに縁のピクセルを繰り返すので、最後の1〜2列の傾きが小さく、または誤ったものになります。ラップ(Wrap)は反対側のピクセル、つまりテクスチャが繰り返されたときに実際に縁の隣に来るピクセルを読みます。範囲の広いカーネル(Sobel 5×5は2px)や面取り・ぼかしの処理は、壊れた帯を広げます。Laigter 1.14の既定では、ambientCGのレンガの四辺に3pxの傾いた帯が残りました。

縁が合っていないのは別の問題です。アルベドの最後の列が、画像内の隣り合う列同士よりも最初の列と大きく違えば、画像はタイルにならず、どのノーマルマップでも隠せません。Nerulioのアルベドの継ぎ目の比率はまさにこの2つを比べます。1程度なら見える継ぎ目はなく、ラボとStudioは両方向とも1.5以下のときに継ぎ目なしとみなします。

エンジン側も繰り返す必要があります。UnityのWrap Mode Clampは繰り返さずに「テクスチャの縁を引き伸ばし」、GodotのBaseMaterial3D.texture_repeatは既定でオン、glTF 2.0のサンプラーの既定はリピートです。クランプされたテクスチャは細い線ではなく、引き伸ばされた縁として見えます。

すべての線がテクスチャにあるわけではありません。タイルの境目ではなくモデルのUVの継ぎ目に沿う線はメッシュ(UVや接線)から来ており、テクスチャを変えても直りません。

クランプ(Clamp)
画像の外のサンプルが縁のピクセルになる。スプライトには正しく、タイルには誤り。
ラップ(Wrap)
画像の外のサンプルを、次のタイルのように反対側から取る。
ラップ(ロール)検査
テクスチャを半分ずらしてマップを作り、結果を戻して2pxの縁の帯を比べる。0ならラップ正確。
継ぎ目の比率
繰り返しの境目をまたぐ差 ÷ 画像内の隣同士の差。

例:境目をまたいで続くべき傾き

1ピクセルごとに10段階上がるハイトの傾斜が、256pxのテクスチャの繰り返しの境目をそのまま通ります。中心差分(StudioのPixelカーネル)で計算すると:

ハイト   x=254: 100   x=255: 110  |  x=0: 120   x=1: 130      内側の傾き = 1pxあたり10
Wrap     x=255: (h[0] − h[254]) / 2 = (120 − 100) / 2 = 10    x=0: (h[1] − h[255]) / 2 = 10
Clamp    x=255: (h[255] − h[254]) / 2 = (110 − 100) / 2 = 5   x=0: (h[1] − h[0]) / 2 = 5
→ Clampは境目の両側2列の傾きを半分にする:繰り返しごとに2pxの線

ambientCGのレンガでのロール誤差(0 = ラップ正確)、2026-09-24:
Nerulio (Wrap) 0 · Laigter 1.14 既定 63.8、Tileプリセット 0 · PBR Forge 0.57、Tile 0.24 · NormalMap-Online 0

同じレンガで、Nerulioのノーマルマップの境目をまたぐ差は内側の差の1.19倍、Laigterの既定は24.0倍でした。タイルになるテクスチャと、ラップを正しく扱う生成ツールなら、この比率は1の近くに保たれます。

できること

  • 透明ピクセルのない画像には「タイル テクスチャ」を提案し、端の扱いはラップに。すべてのカーネルが境目を越えて反対側を読みます。
  • チェックパネルのラップ検査は、テクスチャを半分ずらしてマップを作り直し比較。0なら継ぎ目なし。
  • アルベド自体の継ぎ目の比率(1 ≈ 見える継ぎ目なし)で、画像がそもそもタイルにならない場合を知らせます。色の継ぎ目はノーマルマップでは隠せません。
  • タイル 3×3(T)でライティングしたテクスチャを並べ、ライトを境目の上で動かして線がないか確認。
  • 高さマップも同じ。8ビットのレンガの高さマップからラップで作った結果は、ambientCG自身のノーマルマップとの差が8.8°(高さマップとして読むと7.7°)、ロール誤差は0。

使い方

  1. テクスチャ作業画面にタイル用のテクスチャ(または高さマップ)を入れる。
  2. 「タイル テクスチャ」のままにするか、法線マップパネルで端の扱いをラップにする。
  3. チェックパネルでラップ検査が0か確認。アルベドの継ぎ目の比率が高ければ先に画像を直す。
  4. Tで3×3表示にしてLitに切り替え、ライトを境目の上へドラッグ。
  5. Godot 4、Unity 6、またはPNGセットで書き出す。

結果の確認

  • Studio › チェック › 継ぎ目:ラップ検査が縁の差の平均と最大を表示し、0.01未満なら✓ ラップ正確と出ます。
  • Tで3×3表示にしてLitに切り替え、ライトを境目の上へドラッグします。タイルの境目に沿う線が出ないはずです。
  • エンジンでマテリアルを3×3以上繰り返し、ライトを繰り返しの境目の上で動かします。ノーマルマップを切っても同じことをすると、色の継ぎ目とライティングの継ぎ目を見分けられます。

端の扱いと境目で起きること

端の扱い向いている素材テクスチャを繰り返すと
クランプ透明な輪郭のあるスプライト縁のピクセルを繰り返すため、つなぎ目で傾きが途切れ明るい線になる
ラップタイル用テクスチャ(透明ピクセルがなければ提案)反対側からサンプリング、ラップ検査0、線なし
ミラー繰り返さないが縁取りを避けたい画像境目で隣のタイルではなく反射を読み、かすかな線が残ることがある
ラップでもアルベドに継ぎ目対象外:先にアルベドを直すノーマルマップは滑らかでも色につなぎ目が見える

同じCC0のレンガでのロール誤差(0 = ラップ正確):Nerulio 0 · Laigter 1.14 既定 63.8、Tileプリセット 0 · PBR Forge 0.57、Tile 0.24 · NormalMap-Online この素材で0。

トラブルシューティング

症状考えられる原因確認方法対処
テクスチャが繰り返す所にだけ明るい・暗い線、ノーマルマップを有効にしたときだけ縁でクランプしてマップを作ったStudio › チェック › 継ぎ目でラップ検査が0より大きい端の扱い = ラップ(タイル テクスチャ)で作り直す。✓ ラップ正確と出るはず
ノーマルマップを切っても線が残るアルベドやハイトマップ自体がタイルにならないアルベドの継ぎ目の比率が1よりかなり大きい、またはシームレスタイルチェッカー先に画像を直す。Nerulioにタイルにならない画像をタイルにすることはできない
四辺すべてに沿って幅2〜3pxの帯生成ツールが縁をスプライトの端とみなした(面取り・エッジ検出)ノーマルマップだけを見ると、帯が四方で外向きに傾いている生成ツールのタイルモードを使うか、ここでラップで作り直す
縁が引き伸ばされ、テクスチャが繰り返さないエンジンがテクスチャを繰り返さずクランプしているUnity:Wrap Mode、Godot:マテリアルのtexture_repeatWrap ModeをRepeatにする、またはtexture_repeatをオンにする
ミラー(Mirror)の縁で作ったら薄い線が残るミラーは次のタイルではなく反転したピクセルを読む法線マップパネルの端の扱い繰り返すテクスチャにはラップを使う
線がタイルの境目ではなくモデルのUVの継ぎ目に沿っているメッシュのUV配置や接線3DソフトでUVを表示すると、線がUVアイランドの縁にあるメッシュ側で直す。原因はテクスチャではない
既存のノーマルマップにすでに継ぎ目がある別の場所でクランプの縁で作られたマップ読み込んだマップでチェックパネルを実行Nerulioは既存のマップを継ぎはぎで直さない。アルベドかハイトからラップで作り直す

ほかの方法

方法こんなときに向いています
テクスチャラボのノーマルステージのラップハイト → ノーマルの変換を1回だけ手早く行うとき。詳細設定でラップをオンにするかwrap=1で開き、補正 › 継ぎ目チェックでアルベドを測ります。
LaigterのTileプリセットすでにLaigterを使っているとき。Tileプリセットはレンガのロール誤差を63.8から0にしました。
3Dソフトで形状からベイクする面を3Dでモデリングしているとき。繰り返すメッシュからのベイクは、画像の縁の扱いにまったく左右されません。

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

「検証済み」は、実際の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のものです。

バージョンと出典

Studioのテクスチャ作業画面の書き出しは、Godot 4.7.2(6/6ケース合格、最大差1/255)と、Unity 6000.5.3f1・URP 17.5(12/12合格)で読み込んで描画しており、ラップで作ったambientCGのレンガのタイルのケースも含みます(docs/STUDIO-TEXTURE.md)。継ぎ目とロールの数値は、同じCC0のレンガでの2026-09-24の比較によるものです。エンジンの繰り返し設定はUnity 6・Godot 4.7・glTF 2.0のドキュメントから引用しました。

参照した公式ドキュメント

よくある質問

ノーマルマップを作ってから継ぎ目が出たのはなぜ?

色はつながっていても、生成ツールが縁をスプライトの端とみなし、最後のピクセルに傾きや縁取りを入れたためです。たとえばLaigterの既定では四辺に3pxの傾いた帯が残り、Tileプリセットで消えます。

すでに継ぎ目のあるノーマルマップを直せる?

いいえ。アルベドか高さマップからラップでもう一度作ってください。Studioは既存のノーマルマップの縁を部分修正しません。

ミラーはどんな時に使う?

繰り返さないが縁に傾きを付けたくない画像向けです。繰り返すテクスチャに使うと、隣のタイルではなく反射したピクセルを読むため、かすかな線が残ることがあります。

ラップ検査は0なのに線が見える

その線は色の側にあります。アルベドの継ぎ目の比率を見るか、シームレスタイルチェッカーで画像を確かめ、アルベドを直してから作り直してください。

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

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

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

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

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

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