視差遮蔽マッピング(Parallax Occlusion Mapping)をShaderGraphで使用する

視差遮蔽マッピングをShaderGraphで使用する

UnityのShaderGraphにおいて、視差遮蔽マッピング(Parallax Occlusion Mapping)をどのように使えばいいのか調査しました。

視差遮蔽マッピングとは?

CGのレンダリングにおいて、法線マップ(NormalMap)は、非常に有効な方法ですが、対象を斜めから見た際に見た目が芳しくない問題があります。 そこで考えられたのが、視差マッピング(Parallax Mapping)視差遮蔽マッピング(Parallax Occlusion Mapping)になります。 それぞれの技術の基本的な概念は、西川善司さんの以下の記事が非常に分かりやすいです。

視差マッピングと視差遮蔽マッピングアルゴリズムそのものは異なりますが、どちらにも共通するのは、「通常のサンプリングポイントを高低差情報を用いて再計算することでずらす」、という点になります。

ShaderGraphでの実装

視差遮蔽マッピングをShaderGraphで簡単に使っていきます。

今回のサンプル素材は以下のものを使用させていただきました。

www.cgtrader.com

上述したようにどちらも技術もHeightマップを参考にして、オブジェクトのサンプル位置を変更することを基本とした手法になります。UnityにはParallaxOcclusionMapノードが存在しており、このノードにHeightマップを入力することで、新しいSample点のUV座標が得られるようになっています。このUV座標でテクスチャのサンプルを行うことで、高低差があるような表現を行うことができます。 (実際にVertex位置を変化させるわけではない)

基本的なテクスチャのサンプルのノード構成は以下のようになります。

すべての要素のテクスチャをこのUV座標で取得してやればOKです。

ノードの各パラメータの説明は、以下になります。

docs.unity3d.com

通常の視差マッピングの場合は、Parallax Occlusion Mappingノードの代わりに、ParallaxMappingノードを使用するだけです。

実行結果

簡単なシェーダーを実装した結果を以下に示します。 HeightScaleを変化させた場合、それぞれ次のように見え方が変化します。

視差マッピングの場合は変化の量が大きい場合、おかしな形に変形していきますが、視差遮蔽マッピングでは、形状を踏襲した形で変形できていることがわかります。 ただ、処理的には、視差マッピングはかなりシンプルで低負荷なため、この辺りはケースバイケースで使い分けた方がいいかもしれません。

サンプルプロジェクト

上記のプロジェクトは以下からダウンロードできます。 gitlab.com