Quest用シーン制作で気を付けている事

画作り


Warning: Use of undefined constant width - assumed 'width' (this will throw an Error in a future version of PHP) in /home/tsumikiseisaku/www/blog/wp-content/themes/tsumiki/functions.php on line 672

Warning: Use of undefined constant width - assumed 'width' (this will throw an Error in a future version of PHP) in /home/tsumikiseisaku/www/blog/wp-content/themes/tsumiki/functions.php on line 672

Warning: Use of undefined constant width - assumed 'width' (this will throw an Error in a future version of PHP) in /home/tsumikiseisaku/www/blog/wp-content/themes/tsumiki/functions.php on line 672

Warning: Use of undefined constant id - assumed 'id' (this will throw an Error in a future version of PHP) in /home/tsumikiseisaku/www/blog/wp-content/themes/tsumiki/functions.php on line 536

Warning: Use of undefined constant id - assumed 'id' (this will throw an Error in a future version of PHP) in /home/tsumikiseisaku/www/blog/wp-content/themes/tsumiki/functions.php on line 536

2019年12月3日(火)・4日(水)に開催された「XR Kaigi 2019」にて、

弊社が発表させていただいた「制作秘話:クオリティとパフォーマンスのバランスコントロール」の中から

一部を抜粋してこちらで紹介しようと思います。

 

 

 レンダリングスケール 1.3倍


XRSettings.eyeTextureResolutionScale = 1.3f;

 

Questの片目解像度が 1600×1440 なのに対し、

(RGBペンタイル方式なので、実質はその約80%相当にしか見えないらしい)

標準のアイバッファ解像度は 1216×1344 と、小さめです。

Unity Quest

 

弊社のコンテンツは建物が多い...というかほとんどで、

直線が多いため、エイリアスや低解像度による粗が目立ちやすいです。

 

かなり欲張っていますがレンダリングスケールを1.3倍にできれば最高です。

ただ、シーン・システムを作りこんでいくとやはり重くなっていくので、

最終的には 1.2 - 1.1 - 1.0 と落とさざるを得ないことが多いのですが、

可能な限りレンダリングスケールは高めを目指しています。

 

 

 4x MSAA


You should not go over 4x MSAA sampling.

Oculusの公式ドキュメントに従い 4x MSAA を使います。

前述しましたが直線の粗が目立ちやすいので Off にはしません。

Unity Quest

 

 

 固定中心窩レンダリング High


OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.LMSHigh;

周辺視野のレンダリングスケールを落としてパフォーマンスを稼ぎます。

設定には「Off」「Low」「Medium」「High」「HighTop」の5つがありますが、High設定にします。

Unity Quest

 

HighTop設定だと、周辺の低解像度がさすがに目立ちすぎます。

 

 

 Single Pass Stereo Rendering

選択するだけで軽くなるのでありがたく使います。

(特にポストプロセスに影響大ですが、それについては後述)

Unity Quest

 

 

 HDRレンダリングは使用しない

カメラの Allow HDR を外します。

Unity Quest

 

HDRが必要な一番の理由はきっと、露出変化を表現するトーンマッピングでしょう。

建物内外をシームレスに移動する際に、太陽光と人工光の強烈なエネルギー量の差を表現することで、

画的なリアリティーの向上につながります。

レースゲームのトンネル付近が分かりやすいと思います。

 

しかし、弊社の場合はコンテンツの性質上「屋内」か「外の工事現場」であることがほとんどで、

上述したようなケースはかなり少ないです。

 

また、あったとしてもシェーダーでそれっぽくごまかした方が処理が軽いので、

HDRは使わないと割り切ります。

 

 

 ポストプロセスは使用しない

一番の理由は単純に重いからです。

 

また、HDRは使わないと割り切っているので、

トーンマッピングやブルームなど、輝度を利用する系のエフェクトも使わないと割り切ります。

特にブルームは簡単にいい感じっぽい画になるので、誰もがすぐに使いたがりますが、

我慢して諦めます。これだけでポスプロの存在感薄れませんか?

 

次の理由として、これは持論ですが VR に劇的なエフェクトは必要ないのでは?と思っています。

 

人が見る映像は大きく分けて2つあります。

① 自分の目で実際に物体を見る場合。

② NonVRゲームや映画など、カメラで撮影した映像を画面で見る場合。

 

人がリアルだと錯覚するCG映像(ゲームなど)というのは、カメラで撮影したかのような映像です。

子供のころからTVや映画を見ているので、カメラで撮影した映像がどんなものなのかを、

無意識に知っているからです。

 

ただし、どこが どうだから リアルだ リアルじゃない といった言語化は難しいでしょう。

言語化はできなくとも、ぱっと見の感覚で判断できてしまうのです。

 

NonVRゲームで画作りをする場合は、DoF・Vignett・Color Grading など、

ポストプロセスが大きな効果をもたらします。

カメラで撮影したかのような映像に近づけることができるからです。

 

ただし、VRの最終目標は自分の目で実際に物体を見ているかのような映像であり、

目よりも性能の低いカメラを頭部に装着して撮影した映像ではないはずなので、

カメラ映像に寄せる画作りとは違っているはずではないかと。。。

 

ホラー映画なんかで、明るい日中に撮影した映像が、

ポスプロによって薄暗く真っ青な恐怖映像になっている、なんてことが良くあると思いますが、

自分の目がそうなってしまったら変ですよね、きっと。

 

 

 Lightmap Encoding を Normal Quality にする

これは Unity2019 以降の設定です。

Unity2018 以前はこの設定項目は無く、強制的に Normal Quality と同等の設定になります。

Unity Quest

 

ライトマップをベイクすると EXR という32bit画像が生成されまが、

Normal Quality に設定すると DoubleLDR という形式に変換されます。

 

DoubleLDRとは、階調が0~255のLDR画像を2枚用意し、

0~512の輝度を表現するライトマップです。(512以上はクランプされる)

 

前述しましたが、HDRやブルーム・トーンマッピングといった、

高輝度を扱う機能は使わないと割り切っているので、

32bitライトマップではなく DoubleLDR で十分です。

 

 

 Foward Rendering を使用 & 反射はブレンドしない

Forward Rendering では Deferred Rendering と違い、

Reflection Probe による反射がピクセル単位できれいにブレンドされません。

Unity Quest

 

これらの画像は全く同じシーンをレンダリングしたものです、

部屋のような構造の中に、左半分のエリアだけ Reflection Probe を適用しています。

 

Deferred Rendering では左半分とブレンド範囲分にきれいに反射が適用されています。

(右半分のグレーは SkyBox が反射している)

 

それに対し、Forward Rendering では、Reflection Probe の設定範囲など関係なく、

全体に反射が適用されており、ブレンドの質が良くありません。

 

これを放置すると、画として全く効果的ではない上に、無駄にドローコールが増えるので、

1オブジェクトにつき1反射プローブに強制します。

Mesh Renderer の Anchor Override に、該当の Reflection Probe を設定すると良いです。

Unity Quest

 

適用させたい反射ごとにオブジェクトを分ける必要があるので、

少々面倒ですが仕方ありません。

 

 

 LWRP(Universal RP)は使用を見送っている

以下の理由から LWRP(Universal RP)の仕様を見送っています。

 

① 固定中心窩レンダリングが機能しない

② Reflection Probe の Box Projection に未対応

 

 

 ノーマルマップの使用を控える

粗いノーマルマップはCG臭さを増長させます。

あまりに微細な凹凸は Smoothness マップで何とかなるので、

重要なモノ・目立つモノにのみ、ある程度高解像度のノーマルマップを使用します。

 

また、ノーマルマップの重ね掛けも、思った以上にパフォーマンスが悪いので、

画的クオリティのために、どうしても必要なものに限定します。

(描画面積の広い、床・壁など)

 

 

 Directional Lightmap は使用しない

ライトマップの長所と短所は以下です。

 

長所:高品質な陰影が表現できる

短所:ピクセル単位の微細なライティング効果が得られない

短所:ノーマルマップの計算に使用されない(凹凸がなくなる)

 

Unityでは「ライトマップを焼くとノーマルマップが消えた」なんて質問が

過去に大量になされたかと思います。

輝度だけ格納して、その他のライト情報を無視しているので当然です。

特に Unity4 の時代は、Reflection Probe が無かったので尚更です。

 

しかし、Directional Lightmap を使うと、

輝度画像とは別に、方向を格納した画像も生成され、

ライトマップでもノーマルマップの効果が得られる云々、などの改善がなされます。

 

ただ、オクルージョンテクスチャや反射などで、十分に見た目のカバーが可能で、

そこまで Directional Lightmap の効用は見られないので、使わないと割り切ります。

 

 

 光源の反射に気を付ける

ライトのマテリアル輝度を1以上にし(Emission)、

Reflection Probe の HDR をオンにしてベイクします。

(前述のカメラHDRとは別物なので注意)

 

カメラHDRを使用していないので、最終的なレンダリングピクセルは1にクランプされますが、

Reflection Probe が持っている Cubemap 画像としては1以上の輝度を持っているので、

光源部分だけを強烈に反射させることができます。

 

ガラスに反射した蛍光灯が灰色なのは変だという事です。

 

 

 マテリアルでトーンマッピング

コチラの記事をご覧ください。

 

 

 拡散反射と鏡面反射の遮蔽設定を分ける

コチラの記事をご覧ください。

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)