Blenderでノーマルマップをベイクする

# 初めに

Blenderを使ってノーマルマップをベイクする備忘録です。
最後にノーマルマップをベイクした時にうまくいかなかった時に、私の環境でやったらうまくいったTipsを随時更新していこうと思います。

# 環境

Windows 10
Blender 3.5

# やり方

### ①ハイポリのモデルとローポリのモデルを用意する
例として三角面が9,406ポリゴンのハイポリのメッシュと三角面が706ポリゴンのローポリゴンを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/aebd2b76-b63d-3980-f85b-1c4962e4c71d.png)

### ②マテリアルを作成して適用
例としてハイポリ用のマテリアルM_Highとローポリ用のマテリアルM_Lowを用意しました。
ローポリ用のマテリアルのノーマルマップはこれから作成するので画像テクスチャがつながっていない状態です。

■M_High
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/00699bcd-8b37-381a-9914-be444261779c.png)

■M_Low
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/ea29928b-e0ab-84a0-d3d8-d28ab975b172.png)

### ③ノーマルマップをベイクする用のテクスチャを用意
Shadingタブのローポリ用のマテリアルを選択指定状態で「add」またはShift + AキーでImage Textureを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/c3364bc2-959b-ba4c-7025-a19a38bce1c4.png)

Image Textureの「+ New」ボタンをクリック。
ボタンをクリックすると詳細が表示されるので以下のように設定。

・Name：今回はMap_Testにしました
・Width, Height：今回は他のテクスチャが2Kだったので2048pxを指定しました
・Alpha：チェックを外します
・32-bit Float：チェックを入れます。チェックを入れないとノーマルマップが粗くなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/dbae016b-6612-1b73-068b-6132e4e20983.png)

OKを押した後Color Spaceを「Non-Color」に設定してノードをMappingとNormal Mapにつなげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/c6dba78a-edf7-a316-ba47-ff5ab0609a60.png)

### ④ハイポリモデルとローポリモデルの位置を調整する
今回の例ではハイポリをコピーしてローポリのモデルを用意し、ハイポリの詳細な凹凸をローポリ用のマップにベイクします。
このような場合、ハイポリとローポリの位置を正確に同じにしておくとベイクの結果が上手くいきやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/765725ad-b467-36f7-23d2-74f766d70a7c.png)

ハイポリとローポリが別の形状であり、ローポリのノーマルマップに対してハイポリのモデルをベイクするような場合には同じ位置ではなく、重ならない近い位置に配置します（意図的に重ねる場合を除く）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/8173d353-c0c1-dcc8-a35c-1428a62c628e.png)

### ⑤ローポリモデルのUV展開をする
ローポリモデルの方は必ずUV展開をしている必要があります。UV展開をしないとベイクが上手くいかないです。
ハイポリモデルの方はUV展開をしていなくても平気です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/e3df0ddc-3e0e-5098-2b27-81c691f33da0.png)


### ⑥レンダープロパティの設定を行う
レンダープロパティの「Render Engine」の設定を「Cycles」に設定します。
そうすると下の方に「Bake」のセクションが表示されてベイクの設定を行えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/2345ca1b-784f-ea8b-8262-298aae05fd09.png)

Samplingのタブ内にあるRenderタブを開きます。
MaxSampleの値を1にします。MaxSampleの値を大きくしてもノーマルマップのベイクには大きく影響しないので、レンダリング時間を少なくするためにも小さい値を設定することを勧めます。

Denoiseのチェックを外しておきます。Denoiseが有効だとノーマルマップのベイク結果にシミのようなものが発生する場合があるみたいなので外しておく方が無難かと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/5357b09d-0a9f-eea5-3907-2f0b4fa74da7.png)


Bakeのタブを開いて各項目を以下のように変更します
・Bake Type：Normalに変更します
・Selected to Active：チェックを入れます
・Extrusion：ローポリのオブジェクトをどれだけ膨らませて計算させるかの値を設定します。今回はローポリがほとんどハイポリを内包する大きさなので0でも大丈夫です。ローポリとハイポリが離れている場合はハイポリが含まれる値を入力します
・Max Ray Distance：ベイクの結果が良くなるように調整しながら値を入れます
・Clear Image：初回のみチェックを入れます。チェックを入れると対象となるImage Textureの画像を一度クリアにして新しく画像を生成します。同じ画像に対してベイクを繰り返す場合はチェックを外さないと上書きされてしまうので、初回以降はチェックを外します。
・Margin：UV展開の境界線部分からどのぐらいはみ出るかを指定します。今回はそんなにはみ出る必要がないので小さい値にしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/83aaf8f2-ef7b-737b-1a42-5960490fcd84.png)

### ⑦ベイクを行う
ハイポリを選択してCtrlキーを押しながらローポリを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/83b1e524-c53a-a825-ed5b-4879dec89f0d.png)

ベイクする用のImage Textureのノードを選択する（選択できているとノードの周りが白くなります）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/5687e348-2ca4-9337-6842-f595fd6bb373.png)

レンダープロパティのBakeセクションの「Bake」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/3866cda6-eba2-2d13-e3f9-e57695412355.png)

ベイクが上手くいくとShadingタブ内の画像ビューにベイクの結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/a68276d2-3ac3-33bf-4d3d-8b234091c3ba.png)

ベイクの結果です。
ローポリの方にも凹凸が表現されていてハイポリに近い見た目になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/ee96fcaa-06dd-48b7-f118-8746668522e6.png)

ローポリ同士で作成したノーマルマップを適用したものとそうでないものの比較です。
ノーマルマップを適用していない方は凹凸がないのに対してノーマルマップを適用したものは凹凸が表現されているのが分かるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/167c11f5-28cd-c5c3-83c4-07e255d73f4b.png)

### ⑧作成したノーマルマップを保存する
Shadingタブ内の画像ビューにある三本線のアイコン（画像参照）をクリック→Image→Save/Save Asで画像を保存します。
続けて同じ画像に対してベイクをする際に、次のベイクの結果が良くなかったりすると、今回のベイクからやり直しになってしまうので納得のいくベイク結果が得られたら必ずノーマルマップの画像を保存しておくことをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/b5c322c8-c0a9-9289-a09a-17c6cce2333a.png)