UDN
Search public documentation:

DevelopmentKitGemsParallaxOccludedMappingJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

Unreal Development Kit ホーム > Unreal Development Kit Gems > 視差オクルージョン マッピング
UE3 ホーム > マテリアルとテクスチャ > 視差オクルージョン マッピング


視差オクルージョン マッピング


2011年3月に UDK について最終テスト実施済み
PC 対応

概要


視差オクルージョンマッピングとは、レイトレーシングのコンセプトを用いて仮想変位テクスチャを作成するレンダリング方法です。これによって最終的には、石壁などのテクスチャの外見がデプス (奥行き) をもち、壁やフロアの平坦な感じが減ります。この技術の効果については、ウェブ上に多数情報が掲載されているため、本解説ではこれ以上の説明はしません。

さまざまな仮想デプスの方法を比較する


法線マッピング

法線マッピングは、光源に基づくデプスレベルを実現する標準的な方法です。生来、私たちの目は光と影によって容量を知覚します。最上部が明るく最下部が暗い部分は、通常、画面から飛び出して見えます。その逆の部分は、画面に埋没したように見えます。ただし、法線マップは、実際にテクスチャの座標を変更することが一切ないため、子細に観察すると平坦であることが分かります。また、法線マップを使用しても負荷が非常に小さいため、パフォーマンスに影響を及ぼすことはほとんどありません。

NormalMapComparision.jpg

バンプオフセット マッピング

バンプオフセット マッピング (あるいは 視差マッピング) は、カメラの視線方向に基づいてテクスチャの座標を変更することによって、深度を加えるものです。ディフューズおよび法線、スペキュラの UV マップを変位させることによって、人工的なデプスが知覚されるようになります。バンプオフセットはいくつかの命令を加えるだけであり、通常、かなり小さい負荷でしかありません。

BumpOffsetComparision.jpg

バンプオフセット マッピングの主な問題には、高さオフセットの高い部分においてピクセルのスイミング現象が生じ、概して視覚的に正しくならないということがあります。

BumpOffsetErrors.jpg

視差オクルージョン マッピング

視差オクルージョン マッピングでは、レイトレーシングによってカメラの視線方向に基づく正しいテクスチャ座標を見つけてデプスを追加します。これによって、本物のパースペクティブによる正しいデプスがマテリアルに追加されます。また、オクルージョン部分は、深みを増すのに役立つ他の部分を高さマップの部分がオクルードすることができるということを意味します。最後に、セルフシャドウイングをともなって、さらに人工的なデプスがマテリアルに追加されます。ただし、視差オクルージョン マッピングはとても負荷が大きいため、通常は、限られた部分に使用すべきです。

ParallaxComparision.jpg

視差オクルージョン マッピングの主要な問題には、斜めのアングルでレイトレーシングがしばしば正確さに欠くため、正しい高さマップを取得できないということがあります。下図から分かるように、斜めのアングルではレイトレーシングが正しいデプスを得ることに簡単に失敗してしまい、不正確なデプスを得てしまいます。これを解決するには、デプスのパスの数を増やすか、高さスケールを減らします。高さスケールが大きいと同じ問題が発生します。

ParallaxProblem.jpg

次のスクリーンショットは、斜めのアングルから見た視差オクルージョン化されたマテリアルです。階段状になった「パンケーキ」問題に注目してください。

ParallaxOcclusionSteppingProblem.jpg

マテリアルの構成


マテリアルのサイズに基づき、各部分を個別に調べていきましょう。

視差オフセットの計算

視差オフセットは、高さマップをステップ実行して適切なデプスを見つける際に利用されるベクターです。これは、(すでにタンジェント空間にある) カメラベクターの長さの 2 乗を見つけることによって計算されます。さらに、そこからカメラベクターの z 値を 2 乗したものを引きます。さらに、この平方根をとり、これを、カメラベクターの z 値で割ります。さらに、これにカメラベクターの x および y 値を掛けることによって、x および y という 2 つの部分をもつベクターを作ります。最後に、これに高さスケールを掛け、x および y 成分だけを返します。

ParallaxOffsetThumbnail.jpg

デプス パスユニット

各デプス パスユニットでは、予め定められているステップサイズを視差オフセットに掛け合わせます。マテリアルには、デフォルトで最大 9 のデプス パスしかないため、ステップサイズは、0.1f (1 / (1 + デプスパス)) となります。ここからデプスが計算され、高さマップから取得される高さと比較します。高さが、計算されたデプスよりも大きい場合は、視差テクスチャ座標が渡されます。そうでない場合は、次のデプス パスに入ります。各デプス パスは、1 つずつステップサイズを増やし、高さマップの中に一層深く投影します。デプス サーチの質を高めるためにデプス パスの数を増やすことが可能です。ただし、マテリアルはパフォーマンスと命令数の上限によって制限されます。すべてのデプス パスの最後に、視差テクスチャ座標が返されます。

DepthUnitThumbnail.jpg

ディフューズの計算

ディフューズを計算するには、ディフューズ テクスチャ パラメータをサンプリングします。

Diffuse.jpg

エミッシブの計算

エミッシブを計算するには、エミッシブ テクスチャ パラメータをサンプリングし、ベクターパラメータを掛けます。これによってエミッシブの色合いと輝度を調整することができます。

Emissive.jpg

スペキュラの計算

スペキュラを計算する方法は 2 つあります。静的なスイッチ上で値をセットすることによって、そのどちらかの方法を使用するようにできます。
  • ベクターパラメータをディフューズに掛け合わせることによって計算される。利用できるスペキュラ テクスチャがない場合に役立ちます。
  • ベクターパラメータをスペキュラ テクスチャのサンプルに掛け合わせることによって計算される。固有のスペキュラが必要な場合に役立ちます。

SpecularThumbnail.jpg

スペキュラパワーの計算

スペキュラパワーの計算方法は 2 つあります。静的なスイッチの値をセットすることによって、そのどちらかの方法を使用するようにできます。
  • ベクターパラメータをスペキュラパワー テクスチャ サンプルに掛け合わせることによって計算される。
  • ベクターパラメータを返す。

SpecularPowerThumbnail.jpg

法線の計算

法線は、ディテール法線を用いても、用いなくても計算することができます。これによって、ディテール法線を適用すべきかどうかを決定することができます。ディテール法線のデプスとスケールを変更することもできます。法線情報が Reflection Vector によって必要とされるため、この法線の結果は、マテリアルのための Normal (法線) の入力に接続されます。

NormalThumbnail.jpg

シャドウの計算

シャドウを計算するには、初期のデプスパスで見つかったデプスから始まるレイトレースを逆行させます。レイが上方に向かってインクリメントされながら、高さマップがサンプル化され、シャドウの値が各トレースのセグメントから計算されます。シャドウのセグメントがすべて計算された後に、最終的な値が計算されます。

ShadowThumbnail.jpg

ディフューズとスペキュラの追加

シャドウは手動で計算されるので、マテリアルは、「Unreal」のデフォルトの計算を利用して、独自のカスタム光源処理ソリューションの行を使用する必要があります。デフォルトでは、マテリアルが Phong シェーディングを使用することによって、インゲームの他のあらゆるマテリアルと同様になるようにします。そのためには、ディフューズ成分を最初に計算し、次にスペキュラ成分を計算して、その結果を加えます。

DiffuseSpecularThumbnail.jpg

シャドウ係数の乗算処理

ディフューズとスペキュラが追加された後に、結果として得られたピクセルにシャドウ係数を掛けることによって暗くします。ここでは、コンスタント クランプを調整することによって、シャドウの暗さや、環境光の輝度を定義することが可能です。また、ここには静的なスイッチがあり、シャドウイング経路を有効化 / 無効化するために使用することができます。

ShadowMultiply.jpg

エミッシブの追加

エミッシブは光源処理の計算に一切影響を及ぼさないため、一番最後に追加されます。

AddEmissive.jpg

最終的なマテリアル ツリー ノード


次は、マテリアル ツリー ノードの完全な図です。クリックして拡大することができます。(2.5MB 程度)

MaterialNodeTreeThumbnail.jpg

注記


マテリアルのサイズのために、マテリアルのインスタンス化に時間がかかる場合があることにご注意ください。

シルエット クリッピングの実験


視差テクスチャ座標が 1.f を超える場合や 0.f に達しない場合を検知することが可能です。そのような場合は、オパシティを 0 にセットすることができます。これによってある種のシルエット クリッピングが作成されますが、完全なものではありません。

SilhouetteClippedParallaxOcclusionMapping.jpg


ParallaxExampleA.jpg

ParallaxExampleB.jpg

ParallaxExampleC.jpg

ダウンロード


  • コンテンツとマテリアルは、 ここから ダウンロードすることができます。 (ParallaxOcclusionMapping.zip)