シームレステクスチャ チェッカー · 継ぎ目を見つけて直す
「平均差23」だけでは何もわかりません。チェッカーは繰り返しの境界の差を、同じタイル内のふつうの隣接行の差と比べ、継ぎ目がテクスチャ自体よりどれだけ悪いかで判定します。
テクスチャが継ぎ目なく繰り返せるのは、右端の列が左端の列に、最下行が最上行につながるときです。チェッカーはまさにその境界のペアを測り、軸ごとにタイル内のふつうの隣接行どうしの差と並べて報告します。「平均23」はテクスチャ自体の変化と比べて初めて意味を持つからです。2 × 2・3 × 3のリピート、縁のヒートマップ、軸ごとの判定を表示し、半タイルずらしてクロスフェードすることで継ぎ目を消すこともできますが、その場合ブレンド帯の中の絵が変わります。

- Tiles測定確認· Pillow
- Padded atlas測定確認· Pillow
- Seam report測定確認· Pillow
継ぎ目の測り方
チェッカーは行ごとに最後のピクセルと最初のピクセル(横の境界)、列ごとに最下のピクセルと最上のピクセル(縦の境界)を比べます。2つのピクセルの差は、アルファを含む4チャンネルの差のうち最大の値(0〜255)です。軸ごとに平均と最大、ヒートマップ用の行ごとの値が出ます。
基準はタイル内で隣り合うすべての列(または行)のペアの平均差です。境界の平均がmax(2, 1.25 × 隣接の平均)以下ならその軸は合格で、両方の軸が合格すれば継ぎ目なしと判定します。だから境界の差が21段階ある粗い石のテクスチャは合格し(隣どうしも21違う)、252跳ぶなめらかなグラデーションは不合格になります(隣どうしは4しか違わない)。ヒートマップも同じ隣接の平均で目盛りを合わせるので、継ぎ目のないタイルが真っ赤に塗られず暗いままです。
シームレス化はタイルを幅と高さの半分ずらして元の境界を中央で出会わせ、その中央線の両側の帯を半分ずらしたコピーとなめらかな重みでクロスフェードします。帯の既定はタイルの12%(64pxのタイルなら8px)で、0〜64pxに設定できます。新しい境界は構造上つながりますが、代わりに中央にブレンドされた十字ができ、大きな模様が二重に見えることがあります。新たに描き足すものはありません。
- 境界のペア
- タイルを繰り返したときに接する2本の線:最後の列と最初の列、最下行と最上行。
- 隣接の平均
- タイル内で隣り合う線どうしの平均差。テクスチャ自体の変化。
- 比
- 境界の平均 ÷ 隣接の平均。1前後なら見えず、63ならはっきりした継ぎ目。
- ブレンド帯
- 移動した継ぎ目の両側で、シームレス化がクロスフェードする帯。
例:不合格のグラデーションと合格のノイズタイル
どちらのタイルも64 × 64です。チェッカーが報告する数値です。
ランプタイル グレー 0 → 252、左から右へ(列ごとに+4)、全行同じ
横 63列目(252)と0列目(0):平均252、最大252
隣接の平均 4.00 → 比 252 / 4 = 63;上限 max(2, 4 × 1.25) = 5 → 継ぎ目あり
縦 全行同じ:境界0、隣接0 → 合格
シームレス化 ずらし32, 32;帯 round(64 × 0.12) = 8px → 境界平均4、隣接5.78、比0.69 → 継ぎ目なし
ノイズタイル 値96〜160:境界平均 20.8 / 18.8、隣接の平均21.5 → 比0.97 / 0.87 → 継ぎ目なしノイズタイルは修正後のランプより境界の差が大きいのに、内部も同じくらい変化しているので合格します。生の数値1つにしきい値を置くと、この2つをどちらも誤判定します。
できること
- 画像全体(またはシート内の任意のタイル)の2×2・3×3リピートプレビュー。
- 左↔右、上↔下の平均・最大差と、タイル内部の同じ測定値。
- その内部差を基準にした縁のヒートマップ、2枚目のタイルとの縁合わせ(任意)。
- シームレス化:半タイルずらして境界をまたいでクロスフェード。前後を表示。
使い方
- テクスチャかタイルをドロップ。
- 軸ごとの判定と数値を読む。
- ヒートマップとリピートプレビューを確認。
- 必要ならシームレス化してダウンロード。
結果の確認
- 3 × 3リピートの中央を100%と200%で見ます。境界に沿って線、明るさの段差、質感の密度の変化がないはずです。
- 両方の軸を読みます。比が1前後かそれ以下で、ヒートマップに辺全体に沿った明るい帯がないはずです。
- シームレス化の後は、ブレンド帯の中で模様が二重になっていないか前後を比べ、判定をもう一度確認します。
- ダウンロードしたPNGをエンジンの広い繰り返し面に貼り、カメラを継ぎ目の上で動かしてみます。
トラブルシューティング
| 症状 | 考えられる原因 | 確認方法 | 対処 |
|---|---|---|---|
| チェッカーは継ぎ目なしなのにゲームで線が見える | エンジンが繰り返しではなく端の固定(clamp)でサンプリングしている、またはミップマップや圧縮が縁のテクセルを変えている | 同じ拡大率で3 × 3プレビューとゲームを比べ、ミップマップを切って試す | エンジンのサンプラー設定でテクスチャを繰り返し(wrap)にし、圧縮後のテクスチャも確認する |
| 縁が透明なスプライトに継ぎ目が出る | 差にはアルファも含まれ、透明な縁と不透明な縁は実際に大きく違う | そのタイルが繰り返す用途かを確認 | スプライトなら結果は無視する。このチェックは繰り返すテクスチャとタイル向け |
| シームレス化の後、中央にぼやけた・二重の十字が残る | クロスフェードが帯の中でテクスチャの別々の部分を混ぜている | 中央線の周りで前後を比べる | 詳細設定で帯を狭くするか、画像エディターで中央を描き直す |
| 合格したのに面が明らかに繰り返して見える | 目立つ模様がタイルの周期で繰り返されている。継ぎ目ではなく繰り返しの問題 | 3 × 3プレビューを離れて見る | 大きいテクスチャ、複数のバリエーションタイル、デカールで模様を崩す |
ほかの方法
| 方法 | こんなときに向いています |
|---|---|
| 画像エディターで半分ずらし、十字の部分を手で描き直す | ブレンドではなく本当に描く必要がある継ぎ目(ひび、板の境目)のとき。 |
| テクスチャを作ったツールのタイリング設定で書き出す | プロシージャルや素材のツールで作ったテクスチャのとき。ツール自身のタイリングなら後から直す必要がありません。ノーマルマップは繰り返すノーマルマップの継ぎ目を参照。 |
出力ファイルと検証方法
「測定確認」は、ダウンロードしたファイルをページ外(Pillow・numpy・独立したパーサー)で開き直して性質を測ったという意味です。ゲームエンジンでの読み込みは試していません。
| 書き出し先 | ファイル | 検証 |
|---|---|---|
| Tiles | tiles/tile-NNN.png · metadata.json | 測定確認 Pillow切り出した全タイルが元の範囲とピクセル単位で一致(余白・間隔・空タイル・重複を含む)。 |
| Padded atlas | padded-atlas.png | 測定確認 Pillow縁のピクセルを外側に複製。記録済みのatlas-padding品質チェックがChromium・Firefoxで合格。 |
| Seam report | PNG (healed) · measurements on screen | 測定確認 Pillowつながるタイルは継ぎ目なし、グラデーションは継ぎ目ありと報告し、修正後のタイルの境界差は平均8段階未満。 |
検証の根拠
合成シート10枚中10枚で本当のグリッドを1位で検出(余白1・間隔2を含む)。切り出したタイル13/13が元の範囲とバイト一致。1600タイルの分割は2.2秒で完了し、キャンセル可能。継ぎ目の判定はタイル内部を基準に測定。
制限
- 判定は境界のピクセル差を測ります。目立つ繰り返しや、タイル内で変わるライティングは検出しません。
- 保存されるのは修正したPNGだけで、測定値は画面上に表示されます。
- 規則的なグリッドのみ。4メガピクセルを超えるとタイルサイズは測定せず手入力です。
- 類似タイルの検出はピクセル差のしきい値で、知覚的な類似度ではありません。
- 「シームレス化」はブレンド帯の中の絵を変え、新たに描き足しはしません。前後を表示します。
- 2 × 2未満のタイルは継ぎ目を測れません。
バージョンと出典
docs/TILE-LAB.mdとtests/game-seams.test.mjsで測定しました。つながるコサインのタイルは比1.3未満で継ぎ目なし、ランプは平均240超・比20超で継ぎ目ありと判定され、シームレス化の後は平均が8未満に下がりました。上の例は同じモジュールで計算し直したものです(64pxのランプとシード固定のノイズタイル)。
よくある質問
「シームレス化」で絵は変わりますか?
はい、ブレンド帯の中で変わります。半タイルずらしてクロスフェードし、新たに描き足しはせず、前後を表示します。
ノイズの多いテクスチャは縁の差が大きくても継ぎ目なしと出るのはなぜ?
内部も同じくらい変化しているからです。判定は継ぎ目をテクスチャ自体の変化と比べます。
無料ですか?アカウントは必要ですか?
このページの機能はすべて無料で、アカウントなしで使えます。透かしや制限された書き出しはありません。
スプライトはアップロードされますか?
いいえ。Studioはこのブラウザのタブ内でデコード・パック・書き出しを行います。プロジェクトはブラウザ(IndexedDB)に自動保存され、.nerulioファイルとして保存できます。
Asepriteやエンジンのプラグインは必要ですか?
いいえ。.asepriteファイルはブラウザで読み書きします。エンジン別のバンドルには必要なものが入っています(Godotはインポート設定とシーン、UnityとGodotのタイルセットは小さなエディタースクリプト)。