テクスチャマップ調整

グレー・アルファ抽出・反転・高さ勾配によるノーマルマップを作成。

ノーマルマップ生成ツールは、高さ画像やグレー画像を接空間ノーマルマップに変換します。ピクセルごとに高さが左右・上下へどれだけ急に上がるかを測り、その傾きをRGBで書き込み、平らな所はちょうど (128, 128, 255) になります。このページはテクスチャラボを開きます。高さマップ・グレーのテクスチャ・スプライトをドロップし、高さにする明るさかアルファ、Sobel・Scharr・Sobel 5×5のカーネル、強さ、OpenGL(Godot・Unity)かDirectXの緑を選んでPNGをダウンロード。処理はブラウザ内で、アップロードはしません。

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

高さからノーマルへ:勾配・カーネル・強さ

ラボはピクセルごとに高さの値を1つ読みます。画像の明るさ(Rec. 709の輝度、0.2126 R + 0.7152 G + 0.0722 B)かアルファチャンネルを0〜255で読み、0〜1として使います。白が高く、黒が低い扱いです。

微分カーネルが隣のピクセルからx方向とy方向の傾きを推定します。既定はSobel 3×3。Scharr 3×3は中央の行を重く見るので斜めの傾きがそろいやすく、Sobel 5×5は広く平均するためノイズは減りますが細部も消えます。どのカーネルも1ピクセルで高さが1単位上がる坂を傾き1と読むよう正規化されているので、カーネルを変えても同じ強さなら同じ傾きになります。

ノーマルは (−強さ·∂h/∂x, 強さ·∂h/∂y, 1) を長さ1に正規化し、(n + 1) × 127.5 で書き込みます。DirectXの出力は緑の符号が逆になるだけで、2つのファイルの違いはそれだけです。Wrapをオンにするとカーネルが反対側の縁をつないで読み、繰り返しテクスチャにはこれが必要です。オフだと縁のピクセルを引き延ばすので、並べたときに継ぎ目が出ます。

高さマップ
白が高く黒が低いグレー画像。
カーネル
隣のピクセルから傾きを推定する小さな重みの格子。
強さ
傾きに掛ける値。スライダーは0〜10、既定は2。
Wrap
反対側の縁をつないで読み、繰り返しマップに継ぎ目を作らない方式。

具体例:1ピクセルごとに32段階明るくなる坂

右へ行くほど1ピクセルにつき32段階明るくなるグレー画像、Sobel 3×3、OpenGL:

傾き = 32 / 255 = 1ピクセルあたり0.1255
強さ1:  n ∝ (−0.1255, 0, 1) → (−0.124, 0, 0.992) → RGB (112, 128, 254)   傾き  7.2°
強さ2:  n ∝ (−0.2510, 0, 1) → (−0.243, 0, 0.970) → RGB ( 96, 128, 251)   傾き 14.1°
平らな所: n = (0, 0, 1)                           → RGB (128, 128, 255)

右へ上がる面は左を向くので、赤が128より小さくなります。ベクトルを正規化し直すため、強さを2倍にしても傾きは2倍になりません。傾き = atan(強さ × 勾配) です。

結果の確認

  • 高さ画像の平らな部分は正確に (128, 128, 255) になるはずです。ラボは3つのカーネルと2つの規約すべてでこれを試験しています。
  • 結果の下にある検証値を見ます。ベクトルの平均長が1.000に近く、ノーマルは面の内側を向けないので青が128を下回らないこと。
  • 繰り返しテクスチャなら、Wrapをオンにした状態で継ぎ目を確認します。たとえばタイル状ノーマルマップの継ぎ目チェックで。
  • 使う前にライトで照らしてみます。エンジンで、または近似(ライト1灯、GGX)と明記されたラボの材質プレビューで。

トラブルシューティング

症状考えられる原因確認方法対処
凸が凹に見えるこの絵は暗い所が盛り上がっているのに、ラボは暗い所を低いと読む確実な凸部の明るい面がライトと反対を向いている「Xを反転(赤)」と「Yを反転(緑)」を両方オン(高さの反転と同じ)。上下だけおかしいなら規約だけを切り替える
繰り返す所に線が出るWrapがオフで、縁のピクセルが引き延ばされた結果を2 × 2に並べて境目を見るWrapをオンにして書き出し直す
凹凸がざらざらしてノイズが多いJPEGの圧縮ノイズや塗りの質感を高さとして読んだなめらかなはずの所を拡大PNGの元画像、Sobel 5×5、または低い強さを使う
スプライトの輪郭は平らで内側だけでこぼこ明るさには面取りがなく、アルファをソースにしたときだけシルエットが高さになるソースをアルファに切り替えて比べるアルファを高さに使うか、スプライト用ノーマルマップ生成の面取りを使う

ほかの方法

方法こんなときに向いています
Studioのテクスチャ作業画面(スプライトのノーマルマップ)スプライトなら、シルエットからの面取り、Godotと同じ計算のライト、フレームごとのシート、検証済みのGodot 4・Unity 6書き出し。
3Dソフトでハイポリモデルからベイク面が実際に3Dで存在するなら、明るさからの推定ではなく本物のノーマルが得られます。
OpenGL ↔ DirectX変換ノーマルマップはもうあり、別の緑の規約だけが必要なとき。

この方法の限界

  • 明るさは形ではありません。塗った影はくぼみに、塗ったハイライトはふくらみになります。
  • ここには面取り、2Dライトのプレビュー、エンジン用バンドルはありません。これらのマップは数値で確認しただけで、エンジンでは描画していません。
  • 出力は8ビットPNGで、16ビットの高さ入力は上位バイトだけを使います。

バージョンと出典

テクスチャラボ、ダウンロードしたファイルで測定:生成・変換したマップは単位ベクトルにデコードされ(平均長1.0001、最大誤差0.0002)、平らな高さは3つのカーネルと2つの規約すべてで (128, 128, 255, 255)、Wrapの縁は実際に2倍に並べた画像内の同じピクセルと一致し、OpenGLとDirectXの出力は緑(255 − g)だけが違います。UnityとGodotのY+の規約は各ドキュメントに従います。

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

使用例

元の図形サンプル · 96 × 64
元の図形サンプル · 96 × 64
処理後のサンプル · 96 × 64
処理後のサンプル · 96 × 64

このツールで作成した例です。ZIPツールはプレビューを表示します。すべてのファイルはダウンロードしたZIPで確認してください。

テクスチャマップ調整

グレー・アルファ抽出・反転・高さ勾配によるノーマルマップを作成。

使い方

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

対応形式

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

このツールでできること

グレー・アルファ抽出・反転・高さ勾配によるノーマルマップを作成。

処理方式と検証状況

advanced · overlapped tiles / luminance height gradient. 品質検証中です。Pro・Flagship水準はまだ実証されていません。

書き出す前に

明度を高さとした近似で、実際の形状やPBR材質を復元しません。

よくある質問

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

明度を高さとした近似で、実際の形状やPBR材質を復元しません。

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

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

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

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