【Unity】【シェーダ】ノーマルマップを合成(ブレンド)する

ノーマルマップの合成の仕方について、日本語の情報が意外と少ないので書いておきます。

ノーマルマップの合成?

例えば皮膚を表現するとき、毛穴などの細かい凹凸を表現するのに2枚目のノーマルマップを使用することがあります。

StandardShader にもノーマルマップが二つ設定できるようになっています。

f:id:halya_11:20180129195253p:plain

自分でシェーダを書く場合には、ノーマルマップの合成の仕方を知っておく必要があります。

Unityの定義済み関数を使って合成する

Unityで定義されている関数を使う場合は簡単です。

まず、UnityStandardUtils をインクルードして

#include "UnityStandardUtils.cginc"

BlendNormals() で合成します。

half3 normal = BlendNormals (normal1, normal2);

自前で実装する

自前で実装する場合には、下記の計算を行います。

half3 normal = normalize(half3(normal1.xy + normal2.xy, normal1.z * normal2.z));

といっても、これは先ほどの BlendNormals() の中身をそのまま書いただけのものです。

これは計算的に正しいわけではないが綺麗に合成ができる手法で、ホワイトアウトブレンディングと呼ばれるようです。

ホワイトアウトブレンディングの詳細についてはいずれ書きたいと思います。いずれ。

参考