みなさんこんにちは、SculptrVR を製作した Nathan Rowe です。この SculptrVR は、VR 用のマルチプレイヤー ボクセル スカルプト アプリケーションです。SteamVR、Oculus Rift、PlayStation VR 用にリリースされました。さらに最近では Oculus Quest や Oculus Go などのモバイル スタンドアロン VR ヘッドセットもサポートされました。Quest のグラフィック処理のための予算は比較的限られているため、結果的に、最適なパフォーマンスを実現するには、新しい効率的なライティング ソリューションを作成する必要がありました。
ボクセル スカルプティングは、モデルのポリゴン数が多いことで知られています。SculptrVR のオクツリー システムは、トライアングルが削減されるものの、それでもまだ数は多いです。優れたエクスペリエンスを実現するためには、画面上に多くのトライアングルが SculptrVR によって表示される必要があるのです。Quest 上では、最大 35万個のトライアングルが得られ、安定して 72 fps のステレオスコピックが維持されます。 しかし、このことによってデフォルトの UE4 のライティング モデルは残念ながら少しばかり高価なものになってしまいます。
画像のモデルは、SculptrVR で作成され、本記事で紹介されている効率的なモバイル ライティングが使用されています。
デフォルトの Lit (ライティング処理をともなった) シェーダーは、単にカラーをBase Colorに引き入れるだけの単純なものですが、数百もの演算が行われています。Fully Rough にチェックが入っていても、Default Lit マテリアルは、クエストの画面に約 5万個のトライアングルしかレンダリングできません。この数字は、快適なスカルプティングを実現するには十分ではありません。
そこで、UE4 のデフォルトのライティングを使うかわりに、独自の Phong ライティングを作成しました。これは、Unlit (ライティング処理をともなわない) のEmissive マテリアルを利用して作ったものです。このマテリアルは高価に思われますが、17 個の演算しかありません。
このマテリアルの挙動や利用方法などを調べたい場合は、次の Pastebin のリンクをクリックしてみてください: https://blueprintue.com/blueprint/1gp1z-xh/
マテリアル内でどのようなことが行われているか、以下で見てみましょう。
まず、3種類のマテリアル タイプがサポートされていることに注意してください。具体的には、粘土 (clay) と 金属 (metal)、発光 (glowin) です。粘土は完全に粗い (rough) 素材を模倣したものです。金属は光沢があり反射します。発光は粘土に一定の glow 量をプラスしたものです。このマテリアル タイプは、各頂点カラーの 8ビットのアンビエント チャネルでエンコードされます。
ワールドは単一の Directional Light (指向性ライト) とアンビエント スカイボックスによってライティングされます (SculptrVR のスカイボックスでは同じアンビエントの部分のコードが使われていますが、定数が若干異なります)。私は Blinn-Phong ライティングを利用して、スペキュラ ハイライトをともなった Diffuse ライティングを作成し、さらにそれに対して、分析的スカイボックスから出るアンビエント ライト (環境光) を追加しています。
以上で得られたものに、頂点カラーと頂点ごとのアンビエントオクルージョン (AO) の項を掛けます。 AO 項は、ボクセル コーン トレーシングのカスタムの変種を使用して、各頂点について CPU で計算されています。
それでは、ライティングのコンポーネントを一つずつ見ていきましょう。
Diffuse:
Diffuse のライティングはカメラの位置に依存しません。太陽の位置によって完全に決定されます。したがって、ここでは、太陽の方向とサーフェスにおける法線との内積計算のみを行います。ここで得られる最終結果は、粘土で 0.2〜1.0、金属で 0.05〜0.25です。 理論的には、純粋な金属のサーフェスは Diffuse ライティングをもつことはありませんが、Diffuse ライトを少し加えることによって、形状をよりよく視認できるようになります。これは、スカルプティング アプリケーションでは重要なことなのです。
Specular:
Specular ライトは、オブジェクトのサーフェスで太陽の反射を示すだけです。ハイライトの Sharpness (明瞭度) は通常 Roughness (粗さ) に基づいており、Blinn-Phong ライティングでは、内積をさまざまな指数で累乗計算するだけで Sharpness が調整できます。この例では、粘土の指数 (power) が 6 に、金属の指数が 64 になっています。また、金属/粘土で、最大 Specular 輝度を上げ下げして調整しています。
Ambient:
Ambient ライティングは、シェーダーに相当する、効率的な「スカイライト」を追加しようとする試みです。上の 3つのコメント ボックスは、空の色と地面の色の間を補間するものです。これは、サーフェスの法線 (粘土の場合) か反射のベクタ (金属の場合) の Z座標に基づいて行われています。この補間は、その Z 座標に定数を掛けるとシャープになります。4番目のコメント ボックスは、Z 座標がゼロに近くなったときに水平線に作用します。地平線は、光沢のある金属オブジェクトがもつ形状の感覚を出すためにきわめて重要です。
Emissive:
Emissive ライトはビューにまったく依存しません。ここで行っていることは、すべての発光するピクセルに基本量を追加しているだけです。SculptrVR では、GlowMultiple パラメーターが周期的に振動することにより、点滅が表現されています。その振動は、ブループリントで、CPU によって制御されます。これを CPU で一度行うことによって、本来であれば数百万ピクセルで再度実行しなければならない数種の演算を省くことができるようになります。
トータルのライティング:
Diffuse、Specular、Ambient ライトは足し合わされ、太陽の色で乗算されることによって、昼/夜の明るさを制御します。その後に、Emissive ライトが追加になります。
動的スカイのパラメータ調整
次の動画で見られるように、太陽をいろいろと動かしてみると、太陽の位置/太陽の色/空の色/地平線の色/地面の色はすべて動的に変化します。
色はすべて、純粋に太陽の方向の Z 成分に基づいてカーブテーブルに保存されています。 これらのテーブルは、手動で調整することによって、SculptrVR のカラーパレットに適切な明るさとコントラストを供給できるようにしました。
上の画像では、白: 金属、緑: 発光、シアン: 粘土に設定されたマテリアルです。これらのオブジェクトはソリッドカラーになっていますが、それでも形状がわかりやすいことにご注目ください。
SculptrVRでは、ライティングを増強させるために、どのマテリアルも Emissive であり、それのマテリアル関数を使用しています。頂点カラーを使用するマテリアル/モデルもあれば、テクスチャを使っているものもありますが、すべて変わることなく同様のライティングを受けます。
以上となりますが、この記事が役に立ってくれればうれしいです。紹介したものをそのまま利用してもいいし、叩き台として独自のバージョンを作成してもいいと思います。読んでくださって、ありがとうございます。