エッジのにじみ処理

透明なテクセルの下へ色を広げ、ミップマップや縮小で出る暗い縁を防ぎます。

透明なスプライト・葉・デカールの周りの黒い(または白い)ふちは、テクスチャの完全に透明なピクセルに黒や白のRGBが残っていて、バイリニアフィルターや小さなミップマップレベルがその隠れた色を見える縁に混ぜるために出ます。直し方は、そのピクセルを縁自身の色で埋める(エッジブリード、ダイレーション、アルファパディング)か、エンジンに読み込み時にやらせる(GodotのFix Alpha Border、UnityのAlpha is Transparency)かです。Nerulioのエッジブリードはアルファ0のテクセルへRGBを2・4・8・16px押し広げ、アルファは一切書き換えません。

画像をここにドロップ複数のファイルをまとめて処理できます
アップロードなし · この端末で処理

ふちはどこから来るか

PNGは色とアルファを別々に保存するので(ストレートアルファ)、アルファ0のテクセルにもRGBの値があります。多くのソフトはそこに(0, 0, 0)か(255, 255, 255)を書きます。等倍ではアルファ0が隠すので見えません。

フィルタリングとミップマップは隣同士を混ぜます。不透明な縁のテクセルと透明なテクセルのちょうど中間のバイリニアサンプルは、2つの色と2つのアルファを平均し、ミップマップの各レベルは上のレベルの2 × 2ブロックを平均します。結果のアルファは正しく半分ですが、色は隠れた黒や白に引っぱられ、縁が暗くなったり光ったりします。レベルが小さくなるほど強まるため、物体が遠いときや小さく描かれたときだけふちが見えることがよくあります。

エッジブリードは隠れた色を置き換えます。Nerulioは1周ずつ色を広げます。すでに色のあるテクセルに隣接する透明テクセルは、その隣(8方向)のRGBの平均を受け取るので、N周の後にはスプライトからN px以内のすべてが縁の色を持ちます。アルファが0より大きいテクセルには触れず、アルファのバイトは1つも書きません。乗算済みアルファのテクスチャは別の方法でこの問題を避けます。色にアルファが掛かっているので、透明なテクセルは何も加えないからです。

どこまでにじませるか。ボックスフィルターのミップマップでは、レベルkの1テクセルが元の2ᵏ × 2ᵏテクセルを覆うため、縁のブロックに混ざる透明テクセルはスプライトから最大2ᵏ − 1 px離れています。したがって4pxのブリードで1/4まで、8pxで1/8まで、16pxで1/16までのレベルがきれいに保たれます。ラボのミップマッププレビューが表示する3つのレベルです。

ストレートアルファ
色とアルファを独立に保存する方式。アルファ0の場所にもRGBがあります。
エッジブリード(ダイレーション)
透明テクセルのアルファは変えずに、縁の色を外側へコピーすること。
ミップマップレベル
テクスチャが小さく描かれるときにGPUが使う縮小済みのコピー(1/2、1/4、1/8 …)。
乗算済みアルファ
色にアルファを掛けておく方式。隠れた色が漏れ出すことはありません。

例:縁のブロック1つの前後

赤いスプライトのテクセル(210, 40, 30, 255)の隣に、黒を持つ透明なテクセルがあります。ミップマップのレベル1は2 × 2ブロック(不透明2つ、透明2つ)を平均します。

ブリードなし   (210+210+0+0)/4, (40+40+0+0)/4, (30+30+0+0)/4, アルファ (255+255+0+0)/4
             = (105, 20, 15, 128)    半透明で明るさも半分:暗いふち
ブリードあり   透明テクセルが (210, 40, 30, 0) を持つ
             = (210, 40, 30, 128)    半透明、赤はそのまま

24 × 24の不透明な正方形の周りで埋まるテクセル数(N pxのブリード:(24 + 2N)² − 24²):
  2 px → 208    4 px → 448    8 px → 1024    16 px → 2560

4pxの値は、ラボがテスト用スプライトで測定した数値と同じです。448テクセルが変わり、すべてアルファ0で、アルファのバイトは1つも変わりませんでした。

結果の確認

  • 補正 › ミップマップで、ブリード後は1/4〜1/16の縁が暗くならずスプライトの色を保つはずです。
  • 結果の注記に埋めた透明テクセルの数が出ます。保存したPNGをチャンネルステージで開くと、Aチャンネルは変わらず、アルファ0の下のRGBに縁の色が入っています。
  • エンジンでミップマップを有効にしたまま物体を小さく、または遠くに表示します。ふちが消えているはずです。

トラブルシューティング

症状考えられる原因確認方法対処
物体が小さいときや遠いときだけ黒・白のふちが出るミップマップのレベルが隠れたRGBを縁に混ぜている補正 › ミップマップでブリード前後の1/4・1/8・1/16を比べる見える最小のレベルまでにじませる(4px → 1/4、8px → 1/8、16px → 1/16)か、エンジンのインポート設定を使う
スプライトが動く・回る・拡大されると等倍でも細いふちが出るバイリニアフィルターが縁と透明な隣の間をサンプリングしているエンジンの画面を拡大するとふちがシルエットに沿っている2px以上にじませる。ドット絵なら代わりにNearestフィルター(Godotでぼやけるドット絵)
テクスチャをリサイズしたらブリードが消えたリサイズがCanvasを通り、アルファ0の下の色を捨てたリサイズ後のファイルをチャンネルステージで開くと、アルファ0の下のRGBが0に戻っているリサイズを先に、ブリードは最後に。ラボの書き出しはリサイズ → ブリード → エンコードの順で動く
WebPやJPEGで保存したらブリードが消えたこれらの形式はブラウザのCanvasを通してエンコードされ、JPEGにはアルファ自体がないPNGとWebPをチャンネルステージで比べるブリードしたテクスチャはPNGで保存する
アトラスで隣のスプライトの色が縁に出るスプライトが隙間なくパックされ、フィルターが隣のスプライトまで届くアトラスでスプライト同士が接しているか見る必要なのはブリードではなくスプライト間の余白・押し出し:アトラスの余白、スプライトシートのパッカー
半透明の縁のピクセル自体が暗い黒いマット上で書き出され、アルファ1〜254のピクセルに色が焼き込まれている暗いピクセルのアルファが0より大きいNerulioでは直せない(ブリードはアルファが0より大きいテクセルに触れない)。元データからマットなしで書き出し直す

ほかの方法

方法こんなときに向いています
Godot 4:Process › Fix Alpha Border(インポート設定)Godotに読み込むテクスチャ。読み込み時に境目のピクセルを周囲の色で埋め、既定でオンなので、通常はブリード済みPNGは不要です。
Unity:Alpha is Transparency(インポート設定)Unityに読み込むテクスチャ。アルファの縁のフィルタリングの乱れを避けるため、色チャンネルをダイレーションします。
乗算済みアルファレンダラーが乗算済みテクスチャでブレンドする場合。隠れた色が漏れることはありません。

バージョンと出典

テクスチャラボで測定(docs/TEXTURE-LAB.md):24 × 24の正方形の周りで448テクセル(ちょうど4周)が変わり、アルファが0より大きいものはなし。アルファ平面の差は0バイト、最初の周は(210, 40, 30, 0)。ミップマッププレビューはsrc/game/texture-fix.jsのmipChainと同じチャンネルごとのボックス平均です。エンジンのインポート設定はGodot 4.7とUnity 6のドキュメントから引用しました。

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

エッジのにじみ処理

透明なテクセルの下へ色を広げ、ミップマップや縮小で出る暗い縁を防ぎます。

使い方

  1. 画像を追加
  2. 設定を調整して結果を確認
  3. 新しいファイルを保存

対応形式

PNG / JPG / WebP / AVIF / HEIC → PNG — 入力のデコードはブラウザ対応と追加エンジンに依存します。

このツールでできること

透明なテクセルの下へ色を広げ、ミップマップや縮小で出る暗い縁を防ぎます。

処理方式と検証状況

advanced · iterative nearest-opaque RGB dilation (alpha untouched). 品質検証中です。Pro・Flagship水準はまだ実証されていません。

書き出す前に

アルファは変更しません。既に切れた・圧縮で壊れたアルファは修復できません。

よくある質問

このツールにはどのような制限がありますか?

アルファは変更しません。既に切れた・圧縮で壊れたアルファは修復できません。

ファイルはアップロードされますか?

このツールで開いたファイルはアップロードせず端末で処理します。コミュニティの投稿に明示的に添付する画像は別途アップロードされます。一部のエンジンやモデルは外部から取得するため、IPアドレスなどの接続情報は配信元に伝わります。

作業は自動保存されますか?

いいえ。画像と編集状態はこのタブに保持され、メディア出力は端末の一時保存を利用する場合があります。言語を変えても作業は残りますが、再読み込み、タブを閉じる操作、別のページへの移動で失われることがあります。