もんしょの巣穴blog

[UE4] Parallax-Corrected Cubemapを実装する

今回は以前の飲み会で話が出たParallax-Corrected Cubemapをマテリアルで実装してみます。
この手法は名前のとおり、視差を正しく計算してキューブマップをサンプリングする手法です。
正しく、と言っても完全に正確なわけではないですが、ある程度の正確さは確保できるので使い方次第では便利です。
理論的な部分については手前味噌ですが、「もんしょの巣穴 Ver2.0」を参照してください。
UE4で取り扱えるキューブマップは、種類と言っていいのかわかりませんが4種類存在しています。

1つ目はスカイライトのキューブマップで、グローバルな空間でのIBLを実装しています。
このキューブマップはオフラインでフィルタ処理が行われ、ラフネスの値に応じて使用するミップマップを変更する機能を有しています。
サンプリング方法は普通の方法で、反射ベクトルをそのままUVW座標として扱います。

2つ目はReflection Captureで、ローカルなIBLを実装するのに利用します。
数段階のレベルでサイズの違うキャプチャ範囲を指定し、主に動的オブジェクトが周囲の環境を反射するのに利用します。
形状はSphereとBoxがあり、実はどちらも視差調整を行っています。
Sphereは球で範囲を指定しますが、この範囲までを描画し、また反射ベクトルとの接触判定を行うのもこの範囲球となります。
Boxの方は配置すればわかりますが、2つの領域が存在しています。
外側の範囲ボックスは描画範囲です。そして、内側のボックスがまさに視差を調整する範囲です。
反射ベクトルはこのボックスとの衝突判定を行い、撮影座標からその点へ向けたベクトルがそのままキューブマップのUVW座標になります。

ue283.jpg 

しかしReflection Captureのキューブマップは解像度が128で限定されており、鏡のようなはっきりとした反射にはあまり適しません。

3つ目は普通にキューブマップをテクスチャリソースとして扱う手段で、普通にアセットとして読み込んでマテリアルでサンプリングすることが出来ます。
必要とあればここでもParallax-Corrected Cubemapを使用することも出来ます。

最後はCube Render Targetを使うもので、使い方そのものは3番目の普通のキューブマップと同様にマテリアルでサンプリングします。
しかし、このRender Targetはゲームのランタイム中に描画を行うことができるので、動的な空間でも使用することが出来るという利点があります。
重いですが毎フレームレンダリングしてプレイヤーキャラを鏡に反射させることも可能です。
まあ、毎フレームレンダリングは十分マシンパワーのあるPCで使うならともかく、スマホなどのモバイル機器では厳しいかもしれませんが。
部屋の様子が変化したフレームのみ撮影を行うことも可能です。

今回はこのCube Render Targetを利用し、マテリアル側でParallax-Corrected Cubemapを実装する手段を紹介します。
なお、すでにMaterial Collectionに追加していますので、そちらを参照してもらっても構いません。

https://github.com/Monsho/UE4MaterialCollection

続きには実装の簡単な解説と各マテリアル等の使い方を書いています。

[[UE4] Parallax-Corrected Cubemapを実装する]の続きを読む
スポンサーサイト
  1. 2015/03/18(水) 18:43:44|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] ResponsiveAAの挙動

先日の勉強会にて、ある人物からResponsive AAの挙動がどうにもドキュメントに書いてあることと違う気がする、と言われました。
Responsive AAについて最も詳しく書いてあるドキュメントは、以下の雪のシーンに関するものでしょう。

https://docs.unrealengine.com/latest/JPN/Resources/Showcases/Effects/SnowExamples/index.html

また、こちらのマテリアルプロパティに関するページも有用です。

https://docs.unrealengine.com/latest/JPN/Engine/Rendering/Materials/MaterialProperties/index.html

これらのドキュメントから察するに、小さな雪のようなパーティクルではTemporal AAによって輪郭が崩れ、存在が認識されづらくなってしまうので、それを回避するためにResponsive AAを有効にするべきという感じに読み取れます。

しかし、Responsive AAを有効にしても透過された部分で普通にTemporal AAが有効になっているようにも見えるし、そうするとそもそもResponsive AAってなんなのよ?という疑問が上がったわけです。

勉強会ではこの部分を調べましたので、知識共有としてブログにまとめようと思った次第です。

その前に、Temporal AAについて簡単に解説します。
先日の勉強会でもわからないという方がそれなりにいましたし、描画担当でもなければわからない部分でもありそうですので。

ポリゴン描画によって塗りつぶされるピクセルはどのように決定されるかというと、ピクセル中にあるサンプリングポイントという点がポリゴン内部にあるかどうかで決まります。
通常、このサンプリングポイントはピクセル中心なのですが、最近の大半のハードウェアで実装されているMSAAではこのサンプリングポイントが複数定義されます。
4xMSAAなどの言葉を聞いたことがある方もおられると思いますが、この場合はサンプリングポイントが4つになります。

この複数のサンプリングポイントの内いくつのポイントをポリゴンが内包するかどうかによってそのピクセルの色が決定されるのがMSAAという技術です。
例えば4xMSAAで、赤い色のポリゴン(R:1, G:0, B:0)が4つのポイントの内2つを内包していると仮定します。
また、残りの2点は一切何も描画されず、背景のクリアカラーとして設定されている青(R:0, G:0, B:1)色が設定されているものとします。
この場合、(赤 + 赤 + 青 + 青) / 4という計算が行われ、結果は (R:0.5, G:0, B:0.5)というカラーになる、という寸法です。

ue278.jpg

しかしこのMSAAはDeferred Renderingで特に弱いですし、バッファ量が増えるなどの弱点も多いため、UE4ではゲーム中のAA手法としてMSAAは採用していません。
その代わりに推奨されているのがTemporal AAです。

MSAAが1回の描画でピクセル内の複数のサンプリングポイント(サブピクセルと呼ばれる)を調べているのに対して、Temporal AAでは1回の描画では1つのサンプリングポイントしか計算しません。
ただし、毎フレーム、サンプリングポイントがずれるようにスクリーンを微妙に動かしています。
これによって時間軸方向にサブピクセルをサンプリングしてブレンドし、結果としてアンチエイリアスを実現するのがTemporal AAというわけです。

しかし、小さくて動くものは同じ場所にとどまることがほとんどないです。
まさにドキュメントにあるような雪片などはTemporal AAの効果で消えてしまうこともあります。
これを避けるのがResponsive AAなのですが、そもそもどういう原理で動いているのか疑問もありました。
というわけで、続きからこの原理を解説します。

[[UE4] ResponsiveAAの挙動]の続きを読む
  1. 2015/03/03(火) 01:11:30|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する