Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LTC(Linearly Transformed Cosines)によるエリアライトのUnit...

がむ
August 14, 2024
9

LTC(Linearly Transformed Cosines)によるエリアライトのUnity URP実装

がむ

August 14, 2024
Tweet

Transcript

  1. 自己紹介
 @gam0022(がむ)
 • CGWORLDにデモシーン の記事を寄稿
 ◦ 「メガデモ」 とも呼ばれる
 ◦ これが64KB?!

    デモシーンを支える プロシージャル技術 
 ◦ https://cgworld.jp/feature/202101-de moscene.html
 3
  2. LTC(Linearly Transformed Cosines)のデモ 
 Unity URP上で実装してみた
 5 
 
 


    
 
 
 
 
 
 
 https://x.com/gam0022/status/1812296534874284391 

  3. LTC(Linearly Transformed Cosines)のデモ 
 
 
 
 
 
 


    
 
 
 
 https://x.com/gam0022/status/1812296534874284391 
 6
  4. LTC(Linearly Transformed Cosines)のデモ 
 
 
 
 
 
 


    
 
 
 
 https://x.com/gam0022/status/1812296534874284391 
 7
  5. LTC(Linearly Transformed Cosines)のデモ 
 
 
 
 
 
 


    
 
 
 
 https://x.com/gam0022/status/1812296534874284391 
 8
  6. LTC(Linearly Transformed Cosines)のデモ 
 
 
 
 
 
 


    
 
 
 
 https://x.com/gam0022/status/1812296534874284391 
 9
  7. 用語説明:BRDF 
 • BRDF(Bidirectional Reflectance Distribution Function)
 ‣ 入射した光がある方向にどのくらいの比率で反射するかの確率密度関数 


    ‣ マテリアルの質感を定義できる 
 11 https://www.youtube.com/watch?v=1Ji21iGW4nY 注目点 入射方向 反射方向
  8. 用語説明:GGX 
 • 金属のBRDFによく使われる
 
 • 最近のゲームエンジンの物理ベースレンダリングによく採用されている
 ‣ GGXをUnity 5.3で導入しました


    ‣ Unreal EngineもGGX(エンジンのソースコード)
 
 • GGXは厳密には法線分布関数(NDF)
 ‣ BRDFを構成する要素のひとつ
 ‣ (説明が大変なので)今回の発表ではGGXもBRDFだと思ってください
 12
  9. エリアライトのリアルタイムレンダリングは難しい 
 エリアライト(面積のあるライト)の場合
 
 • 床の各ピクセルごとに複数回のBRDFの評価が必要になる
 ‣ 床の点とライト方向 ωi が1つに決まらない


    ‣ 半球面上の全方向の積分計算が必要になる
 ‣ BRDFを何回も計算が必要
 • 計算量が多く、処理も重い
 
 
 結論:エリアライトのリアルタイムレンダリングは難しい 
 15 床
  10. BRDFの半球面上の積分 
 • GGXなど複雑なBRDFの積分は数学的に難しい 
 ‣ 解析的な積分は不可能
 ‣ 数値的に積分を計算するしかない
 •

    モンテカルロ積分・パストレーシング
 • オフラインレンダリングの技術になってしまう
 (リアルタイムレンダリングでは難しい)
 
 • cos(clamped cosine)の単純なBRDFの積分は可能 
 ‣ 解析的に積分を計算できる
 16 解析的な積分の例
  11. LUT(ルックアップテーブル) 
 • LUT(ルックアップテーブル) 
 ‣ 事前計算した情報
 ‣ 2DのLUT =

    テクスチャ 
 • LUTにはcos分布に変換するための行列成分を入れる 
 ‣ U方向 roghness
 ‣ V方向 NdotV
 • 解像度は64x64くらいでOK 
 18 float4 t1 = tex2D(_LTC1, uv); float3x3 Minv = float3x3( float3(t1.x, 0, t1.y), float3(0, 1, 0), float3(t1.z, 0, t1.w) );
  12. LTC まとめ 
 • 複雑なBRDF分布を巧妙なトリックで積分 
 ‣ 複雑なBRDF分布を単純なcos分布に線形変換
 ‣ cos分布上で解析的に積分


    
 • LUTにはcos分布に変換するための行列成分を入れる 
 ‣ U方向 roughness
 ‣ V方向 NdotV
 
 結論:エリアライトをリアルタイムに計算ができて嬉しい 😆
 19