超雑訳 Strand-based Hair Rendering in Frostbite

こんぺこ、こんぺこ、こんぺこ~。
Pocolです。
今日は…
[Tafuri 2019] Sebastian Tafuri, “Strand-based Hair Rendering in Frostbite”, SIGGRAPH 2019: Advances in Real-Time Rendering Game course.
を読んでみようと思います。
いつもながら誤字・誤訳があるかと思いますので,ご指摘頂ける場合は正しい翻訳例と共に指摘していただけると幸いです。
尚、図は[Tafuri 2019]より引用しています。

今日はFrostbiteで行われた、ストランドベースのヘアレンダリングに関する研究を紹介します。
これは、ゲームで使用するための現在または近い将来のハードウェアで、ヘアレンダリングとシミュレーションに関して何が可能かを検討することを目的としたプロジェクトです。
この作業はまだ非常に多くのWIPであり、発表されたものは最終的なものではないことを覚えておいてください。



その前に、動画の時間です!
このビデオは、今年の初めにFrostbite開発者ブログに掲載されたもので、私たちのヘアテクノロジーをこのちょっと不気味なマネキンに装着しています。


ところで、人毛とは?

ほぼ円筒形のタンパク質フィラメントで、上の画像にあるようにキューティクルという小さなウロコで覆われています。

非常に細く、約17〜180マイクロメートルです。

ほとんどがケラチンでできていて、髪の色や濃さを決めるのはメラニン色素です。
右のアニメーションは、メラニン色素の濃度を変化させたときの効果を示しています。

人間の頭には、約10万本の髪の毛が生えています。


現在、ゲームでは、複数の毛髪繊維を2次元の面状にまとめたヘアカードやシェルを使って人間の毛髪をモデル化するのが一般的です。
これらのカードは、ツールとアーティストの手作業によるオーサリングを組み合わせて生成されます。

この作業には非常に時間がかかり、正しく表現することは非常に困難です。

上手くいけば見栄えは良いのですが、全てのヘアスタイルに同じように対応できるわけではないので、視覚的なバリエーションが限られてしまいます。

また、髪の毛の非常に粗い近似値であるため、物理シミュレーションやレンダリングのリアルさにも限界があります。

また、非常に単純化されたシェーディングモデルを使用していることが多く、人間の髪の毛のライティングの複雑さを完全には表現できません。これは、明るい色の髪の毛をシェーディングするときに特に顕著になります。


では、ストランドベースのレンダリングでは何が良いのでしょうか?

ストランドベースレンダリングとは、ヘアファイバーを個々のストランド(曲線)としてモデリングするもので、現在、ヘアをオフラインでレンダリングする際の最先端技術です。
これは、Arnoldを使って生成された画像のようなものです。

髪の毛をストランドとしてモデリングすることは、実際の人間の髪の毛のモデルとして優れているため、物理的にもレンダリングにも多くのメリットがあります。

また、ヘアカードを作成する必要がないため、オーサリング時間もヘアカードより短くて済みます。また、ヘアカードを作成するプロセスでは、ヘアカードに投影するための髪の毛のストランドを作成することが多いため、基本的にはすべてのステップで時間を節約することができます。

また、ヘアストランドを使用すると、物理とシミュレーションの両方で、より詳細なカリングが可能になり、デシメーションによる自動LODの生成も容易になります。

このプロジェクトの目標は、リアルタイムのフレームレートを達成しつつ、ヘアストランドを使用して映画品質のヘアにできるだけ近づけることです。


ここでは、システム全体の概要をご紹介します。

アーティストがあるツールでヘアスタイルを作り、それをNURBの集合体としてエクスポートします。

そしてこれらは処理され、一連のポイントとコンストレイントに変換されます。

実行時には、これらのポイントが読み込まれ、シミュレーションされた後、三角形のストリップとしてレンダリングされます。


レンダリングされた髪を正しく見せるためには、物理的に妥当なシミュレーションが非常に重要です。
髪の毛の束は、制約条件を持つ一連の点としてシミュレートされます。
このシミュレーションは、オイラー式(格子上のシミュレーション)とラグランジュ式(点上のシミュレーション)を組み合わせたものです。
摩擦、体積保存、空気力学などのストランドの相互作用は、グリッドを使って計算され、右下には摩擦の色分けされたビジュアルが表示されています。
実際の統合は、各ポイントで個別に行われ、すべての制約とコリダーを繰り返して解くことになります。
ここでは詳細を説明しませんが、興味のある方は、今後のプレゼンテーションやfrostbiteブログで詳細を紹介します。


ヘアのレンダリングは、解決しなければならない3つの主な問題に分けることができますが、これらはすべて、もっともらしい外観を得るために重要です。

1つ目は「単一散乱」で、これは光が1本のファイバーとどのように相互作用するかという問題です。これは非常に複雑な問題で、この分野では多くの研究が行われていますが、その多くはリアルタイムのレンダリングには直接適していません。

単一散乱の次は、多重散乱です。これは、光が複数のヘアファイバーとどのように相互作用するかという問題です。

最後の問題はレンダリングに関するもので、髪の毛は細くて本数が多いため、エイリアシングを発生させず、かつパフォーマンスの高い方法でレンダリングを行う方法です。

これらの問題を順に説明していきます。


単一散乱については,2003年にMarschnerらが作成した髪の毛のオリジナルモデルに基づいたBSDFを使用しています。このモデルは遠景モデルであり、遠くから見たときの髪の毛の視覚的特性をモデル化したものであり、単繊維のクローズアップ用ではないことを意味します。
このモデルはその後、ディズニーとWeta Digitalによってパストレーシング用に改良され、Karisによってリアルタイムで使用できるように近似化されましたが、その一部を私たちも取り入れています。

このモデルは、経度方向の部分Mと方位方向の部分Nの製品として分割されています。

表面の粗さ、吸収率、キューティクルの傾斜角などのパラメータが含まれています。

さまざまなタイプの光路を別々に評価し、それを追加しています。
これらは、反射する光路であるRです。
TTは、ファイバーを介した伝送です。
TRT(単一内部反射による透過)があります。

これらの光路は、p0、p1、p2とも呼ばれます。

もちろん、もっと長いパスを追加することもできますが、ここではこの3つのパスだけを取り上げます。


今度は、光路の違いによる貢献度を視覚化してみます。
まず、光の直接反射を含むR経路があります。
そして、主に背後からの光があるときに貢献するTTパスがあります。
そして、吸収によってより彩度の高い色を示すTRT経路があります。
これらをすべて合わせると、次のようになります。


ここでは、左から右に向かって値を大きくしながら髪の吸収率を変化させた場合の効果を比較しています。

また、代わりにサーフェイスラフネスの値を大きくした場合の効果を比較してみました。

このように、これらのパラメータが知覚される髪の色に与える影響は些細なものではなく、現実的な髪の色を得るためには、この複雑さを捉える必要があります。


さて、実際のモデルについてですが、特に経度方向の散乱について説明します。

経度方向の散乱Mでは、各パスタイプは、経度方向のラフネスとキューティクルの傾斜角度に応じたパラメータを持つ単一のガウスローブを使用してモデル化されます。

これらの方程式の動機については、Marschnerの原著論文で詳しく説明されています。


方位角方向の散乱は、ファイバー内でのフレネル反射と吸収を考慮した減衰係数Aと、光が反射したりファイバーから出たりするときにどのように散乱するかをモデル化したローブである分布Dに分かれます。

透過経路のサーフェイスラフネスを適切にシミュレートするために、この結果を髪の毛の幅で積分して、特定の出射方向における全体の寄与を求めます。

すべてのシェーディングポイントと光路に対してこの式を数値的に積分することは、当然ながらリアルタイムでは不可能です。そこで、近似的に行うことになります。


反射パスRは非常にシンプルで、Karisのプレゼンテーションからの簡略化を利用しています。

分布は次のようになり、減衰は単なるフレネル項ですが、ここではオリジナルの3Dベクトルを使用していることに留意してください。


Karisの発表では、TTパスとTRTパスの近似値も提案されました。この近似式は、滑らかなヘアファイバーの場合には非常によく機能します。


しかし、髪の毛の繊維の粗さが大きくなり、外観が内部吸収に支配されるようになると、この近似式はうまく機能しなくなります。

私たちは、この近似式を改良したいと考えました。

まず、減衰項Aについて考えてみましょう。


透過時の減衰項を分析すると、ファイバーの中央部をまっすぐに透過する光の寄与が大きいことがわかります。そのため、\(h\)パラメータが0のとき
\(h\)が0のときに計算された減衰量と、完全な積分値を比較すると、これは実際にはかなり良い近似値であることがわかります。

以下は、3つの異なる吸収値に対するこの近似値を示すプロットで、基準となる積分値は十字で、近似値は実線で描かれています。

これは、Karis氏が使用した近似式がどのように積み重なっているかを示したもので、特に半透明で明るい髪の毛の場合、グレージング角に問題があることがわかります。


分布にはLUTを使用しています。
この分布は、ラフネス、方位角、経度方向の出射角に依存するため、LUTは3次元になります。


しかし、この3Dテクスチャ全体を保存するのではなく、各方位角スライスにガウス関数をフィッティングすることで、2Dに再パラメータ化します。

つまり、ガウス関数のパラメータ\(a\)と\(b\)を積分値にフィットさせ、それを2チャンネルの2Dテクスチャに格納するのです。


そこで、トランスミッションされたパスをまとめます。

分布はLUTを使って近似します。ガウスのパラメータを調べて、方位角を使って評価します。
また、減衰項\(A\)は、\(h=0\)の定数値を用いて近似します。


そして、いよいよ最後のTRTパスです。

分布については、Karisの近似値にスケールファクター\(s_r\)を加えて改良していますが、これは式の中で強調されています。
このスケールファクターは、サーフェイスのラフネスの影響を近似するために手動で調整しました。
しかし、この近似はまだかなり粗いので、場合によっては視覚的な品質を向上させるためにもう少し作業が必要かもしれません。

減衰項は、透過経路の場合と同じ方法で近似しますが、ここでは代わりに3の平方根を2で割ったh値を使用します。これはKarisの近似式で使用された定数と同じです。


これらをまとめて、KarisとDisneyのリファレンスとの比較をしてみました。

TTとTRTに変更を加えたことで、特にラフネス値の高い髪を使用したときの彩度の変化をよりよく表現できていることがわかります。



ここでは、単一の光源のみで照明された明るい髪の毛で、経度方向のラフネスの値を変えて比較しています。

ここでは、上段の光沢のある髪のハイライトと、下段の色の両方が改善されているのがわかります。



さて、次に多重散乱です。
多重散乱は、リアルな彩度や奥行き感、ボリューム感を出すために重要なエフェクトです。特に明るい色の髪の毛の場合は、この効果が必要です。

右の動画を見ると、彩度が上がっていることと、髪のボリュームのライティングがより滑らかで自然な感じになっていることがわかると思います。



単一のファイバー内での光の挙動を捉えることを目的とした単一散乱とは対照的に、多重散乱は光が多数のファイバーを通過したときの効果をモデル化しようとするものです。
つまり、光源とカメラの間で光が進む複数の経路を評価する必要があります。
もちろん、これはリアルタイムレンダリングでは実現不可能なので、この効果も近似する必要があります。



我々の実装では、Dual Scatteringと呼ばれる近似法を使用しています。

Dual Scatteringのポイントは、多重散乱を2つのコンポーネントの組み合わせとして近似することです。

ローカルな散乱 グローバルな散乱

局所散乱はシェーディングポイントの近傍での散乱を考慮し、目に見えるヘアカラーの多くを占めています。
大域的散乱は、ヘアボリュームを通過する外光の影響を捉えることを目的としています。

二重散乱近似が髪に適しているのは、ほとんどの光が前方方向にしか散乱しないからです。つまり、基本的にはTRTよりもTTからの寄与が大きいということです。

大域散乱は、影の経路、つまり光の方向に沿った散乱のみを考慮して推定されます。そのため、光の方向にあるヘアボリュームの2点間のヘアの量を推定する方法が必要です。


これは、デュアル・スキャッタリングの論文で著者が行ったのと同じ方法で、ディープ・オパシティ・マップを使用しています。

ディープオパシティマップはオパシティシャドウマップに似ています。オパシティシャドウマップとは、ボリュームのあるオブジェクトのシャドウマップをオブジェクト上の多くのスライスで生成する技術です。
ディープオパシティマップの利点は,必要な数が少ないことと,オパシティシャドウマップでよく見られるバンディングアーティファクトに悩まされないことです。

4つのディープオパシティマップレイヤーと、髪の毛の透過率を蓄積するための4つのレイヤーを使用しています。

その後、散乱による減衰が計算され、平均化されてLUTに格納されます。また、ディープオパシティマップは影の判定にも使われています。

低品質のフォールバックとして、毛髪密度定数とBeer-Lambertの法則を用いて減衰を推定することもできます。しかし、これはもちろん、実際の髪のボリュームの変化には適応しません。
デュアルスキャッタリングやディープオパシティマップの詳細に興味のある方は、原著論文をお読みになることをお勧めします。


ヘアストランドはテッセレーションされ、三角形ストリップとしてレンダリングされるので、エイリアシングを適切に処理するために特別な注意が必要です。

髪の毛は非常に細いので、通常、画面のピクセル数よりも小さい幅になります。

そのため、テッセレーションを行う際にはピクセルサイズを考慮し、適切に幅を広げる必要があります。そうしないと、ヘアストランドが欠けたり、壊れたりする危険性があります。



残念ながら、これにはもう一つ良くない副作用があります。それは、髪が太すぎて、太いスパゲッティやストローのように見えてしまうことです。

もうひとつの問題は、オーバードローの量が膨大になり、パフォーマンスに大きな影響を与えることです。



MSAAを有効にするだけでは、残念ながらすべての問題を解決することはできません。

しかし、MSAAを有効にすると、ピクセルあたりのサンプル数が増えるため、エイリアシングの問題が改善され、細い毛の表現を維持することができます。

しかし、オーバードローによるパフォーマンスへの影響は、その数が増えるため、さらに大きくなります。

オーバードローの量を減らすために、ビジビリティバッファを使用します。


ビジビリティバッファを使用することで、すべての髪の毛に対してMSAAを使用した比較的迅速なラスタライズパスを行うことができます。

その情報をもとに、スクリーンスペースのシェーディングパスを行い、最終的にアンチエイリアスをかけたレンダリングを行うことができます。

しかし、ピクセルごとに同じ髪の毛を複数回シェーディングすることがあるため、不必要なシェーディングが行われます。



このオーバーシェーディングを軽減するために、可視性バッファにサンプルの重複排除パスを実行し、異なると考えられるピクセル内のサンプルのみをシェーディングするようにしています。
これにより、ピクセルシェーダの呼び出し回数が大幅に減り、ビジビリティバッファを使用するだけの場合と比較して、約2倍のパフォーマンス向上を実現しました。



ここでは、髪の毛をレンダリングする際の手順をご紹介します。

まず、シミュレートされたストランドセグメントから始め、これらをラスタライズしてシャドウマップとディープオパシティマップを作成します。また、ビジビリティバッファをラスタライズし、サンプルのデデュープパスを実行し、最後にスクリーンスペースシェーディングパスを行います。



パフォーマンスの話をする前に、もう一度指摘しておきたいのは、これはまだ非常に未完成だということです。
パフォーマンスについて検討してきましたが、それはほとんどの場合、このプロジェクトを可能性の領域にとどめておくためでした。例えば、テストモデルでは常にすべてのストランドをレンダリングしてシミュレートしていますが、これはゲームではおそらく誰もやらないことです。

Frostbiteでは通常、新しい技術の導入を容易にするために、ゲームチームと非常に緊密に連携しています。ゲームチームは、新しい技術の導入を容易にするために、ゲームチームと緊密に協力しています。

いずれにしても、通常のPS4で900pの解像度、MSAAなし、髪の毛が画面の大部分を覆っている状態でのパフォーマンスを示す数値を以下に示します。

約10,000本の髪の毛と240,000点のポイントを持つロングヘアのアセットでは、物理演算に約4.7ms、レンダリングに約4.5msかかります。
約15,000本のストランドと約75,000点のポイントを含むショートヘアのアセットでは、物理演算に約0.4ms、レンダリングに約1.9msかかります。

レンダリング時間が長い主な原因は、GPUの使用率が非常に低いことにありますが、現在、改善するためのさまざまな方法を検討しています。

なお、これはすべてのストランドがフレームごとにレンダリングされ、シミュレーションされていることに留意してください。他のヘアシミュレーションシステムの中には、全ヘアストランドの約1%しかシミュレートしていないものもあります。初期の実験では、髪の毛の1/10だけをシミュレートし、その結果を補間することで、5倍のパフォーマンス向上が期待できます。


では、次のステップは?

特にシェーディングについては、もっと性能を向上させる必要があると思います。

また、GPUの使用率を高めるために、ラスタライズを高速化する方法も検討しています

これに関連して、デシメーションによる自動LOD生成の導入を計画しています。

また、近似値の品質をさらに向上させたいと考えています。

また、物理演算のパフォーマンスをさらに向上させ、全ストランドの一部のみをシミュレートすることにもっと取り組む必要があります。

また、シェーディングモデルにエリアライトを組み込む方法を検討したいと思います。






また、TT項とTRT項のみの比較も行っています。



さらに悪いことに、私たちが実際にモデル化しているのは、2Dの円盤ではなく、3Dの円柱での屈折であるという事実を考慮する必要があります。

Bravais指数を適用すると、吸収係数を変更することで、この問題を完全に解決できることがわかりました。
また、2つの仮想的な屈折率を使用することで、これを完全に考慮することができます。1つ目の\(\eta’\)はフレネル方程式の垂直部分に使用され、2つ目の\(\eta”\)は平行フレネル部分に使用されます。

本当に近似する必要がありますね!

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください