人柱系CGモデラーのTipsブログ

3DCGモデラーとして活動する管理人の独自解釈に基づく実践重視の解説や備忘録です。

■管理人は硝子のメンタルです。齟齬や誤字にお気づきの際は優しくご指導ご鞭撻のほどお願いいたします。

一目瞭然、Parallax occlusion mapping(視差マッピング)の重要性

 

Parallax(視差マッピング)をご存知ですか?

 

今回は、ParallaxOcculusionMappingをの重要性を多くの方に知っていただくべく、

POMシェーダーをゲームエンジンに実装するまでのお話をしたいと思います。

 

さて、Parallax、視差マッピングとは何でしょうか。

まずは見てもらったほうが早いので、以下の比較キャプチャを御覧ください。

 

前の記事で使用した鹽竈神社の石畳テクスチャ(1K)です。

 

f:id:maskmen2:20161024160222j:plain

⇧①ノーマルマップのみ(逆光に弱いのが難点)

f:id:maskmen2:20161024160225j:plain

⇧②Parallaxシェーダー実装後(HightMapにより実際の深度が再現されています)

 

さて、如何でしょうか。

 

明らかに…Parallaxは良い仕事をしてくれます。

 

AAAクラスのゲームスタジオなら必ず実装する、ハイエンドゲームCGの絶対条件ともよべる技術だと思います。

 

ノーマルマップのみの場合、カメラ側からのライトではきれいに見えますが、逆光に弱いのが分かると思います。

 

そこで、ノーマルマップの弱点を補うために用いられるのが、リアルタイムにおけるバンプ技術… ParallaxとTessellationです。

 

■Parallax Occulusion Mapping

 

Parallax(POM)は視差マッピングのことで、画像処理的に奥行を再現することができます。

 

奥行きの空間を演出し立体を再現するため、メッシュのシェイプ(ポリゴンのアウトライン)には反映されないのですが、地面などのポリゴンのアウトラインが影響されない凹みの表現が必要な場面で重宝されます。

 

メッシュ分割でパンプさせる方法ではなく画像ベースでステップ数を元に立体形状を再現するため、非常に綺麗に凹凸を再現してくれるのが特徴です。

 

海外のゲームメーカー、Naugnty Dog'sさんに質問したところ、同社のアンチャーテッドではParallaxのみので全てを再現しているとおっしゃっていてびっくりしました。

 

少し重い処理なのが難点です。

 

■Tessellation

 

Tessellationは、Maya等で用いるディスプレイスメントマップの手法に近いため、馴染みがあると思います。

 

Tesselationは実際にモデルを分割し、HightMapでバンプさせる方法で、実際にモデルの頂点を増やして押し出して、ハイディティールなモデルに作り変えてしまう機能です。

 

凸型の、アウトラインが目立つものに使いますが、伸びたり三角メッシュのジャギが気になる場合がでてきます。

 

次の記事でTessellationについて詳しく検証しようと思いますので、合わせてお読みいただけると幸いです。

 

 

 

■使い分け、変種

 

地面などではParallax、岩や建築物にはTessellationと使い分けるのが一般的ですが、UnityAssetのUBERのように、実際にアウトラインに反映する変種POM等も存在しています。

 

UBERは非常におすすめできる変種POMのUnityシェーダーアセットです。

興味のある方は是非チェックしてみて下さい。

 

http://u3d.as/hjM 

www.youtube.com

 

 

 

■シェーダーマテリアルの組み方

 

TessellationやParallaxはそのままのUnity、UE4では使用できないため、よそからアセットを持ってくるか、自分で組むしかありません。

 

Unity4の古いマテリアルの中にはこれらのシェーダーがあるのですが、PBRに対応した最新のStandardシェーダーにはこの2つの要素が含まれていません。

 

今回は、ビジュアルスクリプティングで理解しやすいUE4のBP(ブループリント)で解説していきたいと思います。

 

下の画像が、UE4のブループリントで組んだPOMマテリアルです。

 

f:id:maskmen2:20161024160937j:plain

 

ほぼほぼ必要なもののみに厳選して作っているので、このまま真似して頂ければ再現できるはずですが、

 

仕組みを理解しないと気がすまない、応用できない、と思う方も多いと思うので、ざっくりと説明させていただきます。

 

まず、POMに必要なOutputですが、ノーマルとピクセル深度のオフセットです。

 
最も上流に当たるInputはHightmapで、ParallaxOcculusionMappingノードに接続し、様々な必要な情報を接続します。
 
注意すべき特殊なノードはDitherTemporalAAノードで、ここでMaxステップ数に必要な情報を組みます。
 
ノーマルマップについても奥行きのある情報にしないといけないため、MipValueノードをDerivativeに設定し、DDX、DDY情報を接続する必要があります。
 
最後に、カラー、メタル、ラフ、AOマップなど、一般的なマップのUV情報にParallaxOcculusionMappingノードで生成したParallaxUV情報を接続して終わりです。
 

ParallaxUVを用いないマップは、表面に接続されるため、あくまで簡易的にですが、水に沈む物体などの表現も単独のマテリアルシェーダーで実装できると思います。

 

f:id:maskmen2:20161024170605j:plain

 

 

Parallaxのお話は以上になります。

自分で作るのも大変なので、アセットを買うか、買うのをおすすめします。

 

UE4の場合はほぼ自分で作るしか実装する方法がありませんが、Unityにはアセットがたくさん出ていますので、HightMapだけ用意できる環境にあるなら、是非お試し下さい。

 

 HigthMapの作り方については、次回、Tessellationの検証でふれることにします。