物理ベースのレンダリングーーより正確な微小面分布関数GGX

[微小面モデル（Microfacet Model）（中国語注意）](https://blog.uwa4d.com/archives/Study_PBR.html)は、オブジェクトの表面での反射ハイライトをシミュレートする関数Rsについて言及しました。この関数には、微小面の法線方向の分布を表す関数D（Microfacet Distribution function）があります。材質表面への観察に基づいて、様々な研究者が分布関数のモデルを提案しました。より有名なものはBeckmann（1）とBlinn Phongです。ただし、現在、**さまざまなゲームエンジンで最も使用され、最もパフォーマンスの良いのは、GGXと呼ばれるモデルです。**これは技術記事でよく目にするかもしれません。特にPBRレンダリングパイプラインについて研究した方々にとっては。本日紹介する論文は、有名な2007年のグラフィックス会議EGSR（Eurographics Symposium on Rendering）からのものであり、GGXはこの論文で最初に提案されました。

この論文のテーマは「Microfacet Models for Refraction through Rough Surfaces 」であり、**微小面反射モデルを粗い表面を持つ半透明の材質に一般化する方法の問題を解決し、すりガラスのような粗い表面の透過効果をシミュレートできるようにします。同時に、新しい微小面分布関数GGXを提案します。**さらに、前任者が提案したモデルと実際の測定データを比較することにより、GGXは実際の測定データによりよく適合し、前任者が提案したモデルよりも正確であることが証明されています。

**この論文では、GGXを使用して粗い表面の半透明のオブジェクトをレンダリングしますが、GGXは、微小面の法線方向の分布を記述する関数として、粗い表面の不透明なオブジェクトのレンダリングにも適しています。**たとえば、有名なゲームエンジンUnityおよびUE4では、GGXを使用して不透明なオブジェクトをレンダリングします。次の図（2）は、UE4エンジンのレンダリングPBR結果を示しています。その中に、微小面分布関数はGGXを使用しました。
![Blog-Study_GGX-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2c89d67f-e856-d59d-b5be-5378c6df848b.png)


次に、この論文の内容について紹介します。まず、次の図に示すように、レンダリング効果を紹介します。
![Blog-Study_GGX-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/562a3110-5cd5-d403-0ccf-e6731650ecbc.png)





ここでレンダリングされるのは、滑らかな表面と粗い表面の両方を備えた半透明の球です。滑らかな表面を通して、背景画像の異なる色の縞模様をはっきりと観察することができますが、粗い表面を通して、テクスチャの形状と境界がぼやけます。同時に、球の上部にハイライト反射があることがわかります。これは、上部の光源での球の反射によって引き起こされます。**したがって、反射と透過の両方をを備えたオブジェクトをレンダリングする場合、通常はBSDF（Bidirectional Scattering Distribution Function）を使用してシミュレーションします。**この論文のBSDFには、反射モデルBRDF（Bidirectional Reflectance DistributionFunction）と透過モデルBTDF（Bidirectional Transmission Distribution Function）の両方が含まれています。次に、この論文のBSDFとそれに含まれるさまざまな機能を紹介し、次にこの論文と前任者が提案した方法との比較実験を紹介します。興味のある読者は、読み続けるか、下の結果セクションに直接ジャンプして、もっと多くのレンダリング効果を表示するかを選択できます。


## 一、BSDFの概要

オブジェクトの表面上の点の法線方向n、入射光の方向i、および出力光の方向oが与えられると、オブジェクトの表面材質のBSDFはBRDFとBTDFの合計として表すことができます。
![Blog-Study_GGX-GS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6dbc2a2f-bcf4-874b-925b-699d1fb242d8.png)





ここで、fr（i、o、n）はBRDFを表し、ft（i、o、n）はBTDFを表します。 BRDFの場合、Cook-Torranceモデルの形式を取ります。

![Blog-Study_GGX-GS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/00c0b27c-d4d1-e3ae-57e9-8d918c88b63f.png)




**唯一の違いは、論文の著者がCook-Torranceモデル式の分母πを定数4に変更したことです。**この論文での説明は、関数DがCook-Torranceモデルとは異なる正規化を使用していることです。ここで、hrは入力方向iと出力方向oの間の中間ベクトルです。hr= Sign（i∙n）（i + o）。理想的な鏡面反射の場合、hr方向は反射点の法線方向です。
![Blog-Study_GGX-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/80234b95-2aa6-c551-9757-e442cc85b461.png)





微小面モデルをBRDFからBTDFに一般化するために、この論文では屈折の場合のhtを定義しています。上の図に示すように、屈折面の両側の媒体の相対密度ηiとηoが与えられると、中間ベクトルは次のように表すことができます。

![Blog-Study_GGX-GS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/215df494-0af1-833c-f35d-8657a6a7c1e6.png)




ここで、状況が理想的な屈折である場合、htは法線方向と同じです。

論文の公式の導出によれば（興味のある方は元の論文の導出プロセスを確認できます）、BTDFは次のように表すことができます。
![Blog-Study_GGX-GS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1c7f6e48-03dc-b04c-22d3-fb35125a1de0.png)





上記の式から、論文で定義されているftはCook-Torranceモデルのfrと同様の形式であることがわかります。それぞれの中には、フレネル現象をシミュレートする関数F、微小面の法線方向の分布をシミュレートする関数D、およびシャドウオクルージョン関数Gが含まれています。次に、BTDFでのこれらの関数の定義を1つずつ紹介します。



## 二、 F、G、D関数の特定の形式

まず、フレネル項Fを紹介します。この論文の著者は、Cook-Torranceモデルと同様のフレネル項の表現を使用しました。

![Blog-Study_GGX-GS5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f622fc0d-9341-48b6-c7f7-8bade8d5ad17.png)




ここで、c =|i ∙ n|です。 Cook-Torranceモデルとは異なり、gは媒体の密度に関連する関数として定義されます。

![Blog-Study_GGX-GS6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/3ecf97dc-3e9d-7ba6-43d5-8f9c30541804.png)




全反射が発生すると、F = 1になります。

**シャドウオクルージョン関数Gの場合、論文の著者は、Cook-Torranceモデルとは異なる関数Smithshadowing-masking3を使用します。**この関数は、もともとガウス分布のシャドウオクルージョンを計算するために使用され、後に任意の分布関数に一般化された、微小面法線分布関数Dに依存しています。Smth G関数は、次の2つのサブ関数の積で近似されます。
![Blog-Study_GGX-GS7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c4dca3e8-737e-87dc-ff1f-1a14d293c75a.png)





その中で、G1は微小面法線分布関数Dによって導出されます（興味のある方は原文から特定の導出プロセスを見ることができます）。

最後に、GGX微小面法線分布関数Dと対応するG1関数を紹介します。分布関数Dを紹介する前に、まず微小面モデルのマイクロ法線とマクロ法線の概念を紹介します。微小面モデルは、オブジェクトの表面が不均一な多数の小さな平面で構成されていることを前提としているため、これらの小さな平面の法線は、オブジェクトの表面の法線と同じではありません。

![Blog-Study_GGX-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ca90c308-f512-4507-fca1-26fd0dba5918.png)




上の図に示すように、nはオブジェクト表面のマクロ法線方向を表します。これは、レンダリングで通常使用するオブジェクト表面の法線方向です。 mは、目に見えない小さな平面の法線方向を表します。関数Dは、mの分布を表しています。異なるmの分布は、オブジェクトの表面に異なる程度の粗さをもたらします。

### 2.1GGX分布関数

νが任意の方向を表す場合、θmはmとnの間の角度を表し、θvはνとnの間の角度を表し、αρは制御変数を表します。次に、**GGX分布関数Dとシャドウオクルージョン関数G1は次のように表すことができます。**
![Blog-Study_GGX-GS8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/419cc361-50cb-8e0f-7b23-84960c334197.png)



その中で、Χ+（α）はステップ関数を表し、α> 0の場合は1の値を取り、α≤0の場合は0の値を取ります。論文では、次の図に示すように、さまざまな制御変数の下でのBeckmann、Phong、およびGGXの分布関数とシャドウオクルージョン関数の曲線を比較します。
![Blog-Study_GGX-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/deebae7c-f85f-7af4-17d6-1a13ec2c9dc0.png)





その中で、Beckmann、Phong、GGXはそれぞれ赤、青、緑の線で表されています。**図からわかるように、BeckmannとPhongの分布関数曲線はほぼ完全に一致しており、GGXは狭く、テールが長くなっています。**
![Blog-Study_GGX-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/81599804-6e68-46ad-d5ec-1d68261d6151.png)



上の写真は、Unityエンジンのレンダリング結果です。そのうち、左がGGX分布関数のレンダリング結果、右がPhong分布関数のレンダリング結果です。 GGXの結果では、ハイライトのフェージングテールが長くなり、周囲のブルームの範囲が視覚的に広くなり、実際の反射ハイライトの状況とより一致しています。



## 三、実際に収集されたデータとの比較

論文の著者は、前任者によって提案された方法を使用して、実際の半透明の材質から光透過データを収集します。次に、BeckmannとGGX分布関数のBTDFをそれぞれ適合させます。ground、frosted、etched 及びantiglareの4グループのデータを収集しました。その中で、各グループの制御変数値を次の図に示します。
![Blog-Study_GGX-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/54452c7a-7eb6-aac7-45b4-c55e32046901.png)



各グループのデータの近似曲線を次の図に示します。
![Blog-Study_GGX-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1630691a-f461-e554-7dd2-d1f57aa3bfe0.png)





上から下、左から右に、それぞれground、frosted、etched、antiglareのデータです。黒い点は実際の取得データを表し、Beckmann曲線とGGX曲線はそれぞれ赤と緑で表されます。**上記の曲線からわかるように、GGX曲線（緑）は実際に収集されたデータに近いです。**



## 四、レンダリング結果

論文の著者は、次の図に示すように、実際のデータに適合したモデル制御パラメーターを使用して、粗い表面の半透明の結果をレンダリングし、より優れたレンダリング効果を実現します。
![Blog-Study_GGX-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/28cf74d6-8cfd-2be6-a6bb-230bacf1bac5.png)





その中で、左の写真はBeckmann分布関数とantiglareデータパラメータを使用したレンダリングの結果であり、中央と右の写真はそれぞれground 和 etchedデータパラメータとGGX分布関数を使用したレンダリングの結果です。



## 五、まとめ

この論文は、Cook-Torranceモデルを、粗い表面からの反射のシミュレーションから粗い表面からの透過へと拡張します。そして、新しい微小面分布関数GGXを提案します。実際に収集されたデータをフィッティングし、前任者によって提案された分布関数と比較することにより、GGX関数は実際のデータをより適切に適合させることができます。



## 六、ダウンロードリンク

https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.html

## 参考資料：

【1】 P.Beckmann and A. Spizzichino, The Scattering of Electromagnetic Waves from Rough Surfaces, Pergamon Press, New York 1963.
【2】 http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
【3】 K.E.Torrance, E. M. Sparrow : Theory for off-specular reflection from roughened surfaces. Journal of Optical Society of America 57, 9(1967), 1105–1114.
【4】 https://blogs.unity3d.com/cn/2016/01/25/ggx-in-unity-5-3/

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com