実用化の時代へ!『バイオハザード レクイエム』『プラグマタ』リアルタイムパストレーシング実践事例 [RE:2026 2026年10月2日登壇]

3.1K Views

November 13, 26

スライド概要

2026年10月にカプコンが開催した「CAPCOM オープンカンファレンス RE:2026」の講演資料です。

■ 講演映像(再生リスト)
https://www.youtube.com/watch?v=egV5DwBsbJo&list=PLD_N6X6tKlCM

profile-image

株式会社カプコンが誇るゲームエンジン「RE ENGINE」を開発している技術研究統括によるカプコン公式アカウントです。 これまでの技術カンファレンスなどで行った講演資料を公開しています。 【CAPCOM オープンカンファレンス プロフェッショナル RE:2023】  https://www.capcom-games.com/coc/2023/ 【CAPCOM オープンカンファレンス RE:2022】  https://www.capcom.co.jp/RE2022/ 【CAPCOM オープンカンファレンス RE:2019】  http://www.capcom.co.jp/RE2019/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

実用化の時代へ! 『バイオハザード レクイエム』 『プラグマタ』 リアルタイムパストレーシング実践事例 中本 健太 1

2.

実用化の時代へ! 『バイオハザード レクイエム』 『プラグマタ』 リアルタイムパストレーシング実践事例 中本 健太 1 では,RE ENGINEにおけるパストレーシングについてのお話をさせていただきます. よろしくお願いします. 1

3.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 22 本講演では,パストレーシングの基本の説明から始まり, よく用いられる手法の問題点と改善アルゴリズムの説明を行います. そのほか,本パストレーサにおけるノイズ低減アルゴリズムの紹介も行います. その後,パストレーシングを運用することで問題となった部分の改善方法やパフォーマンスに触れ, 検証中の機能の一例を紹介し,まとめとします. 2

4.

パストレーシングモードにおけるゲーム画面の一例 33 では,始めます. まず初めに,『バイオハザード レクイエム』と『プラグマタ』でパストレーシングモードでキャプチャしたゲーム画像を掲載します. 直接照明と間接照明を含んだほとんどが,今回開発したパストレーサによって表現されています. 3

5.

レンダリングとは スクリーン 44 さて,そもそもレンダリングとはどういうものだったでしょうか. これは,スクリーンの各ピクセルの値を計算することです. ピクセルの値を計算するには,ピクセルに入射する光の計算が必要です. このような部屋のシーンを考えましょう. 4

6.

レンダリングとは スクリーン 55 このとき,例えばこのように光源から壁に二回当たってカメラに届く経路があるでしょう. この計算をすべてのピクセルに対して行うのがレンダリングの基本です. 5

7.

レンダリングとは 66 しかし,実際のところ光源から追跡していったときに,この広大な世界にあるカメラのスクリーンに光が届く可能性は極めて低いです. 6

8.

レンダリングとは 77 真ん中の部屋なら,光源からの光が椅子に当たってスクリーンに届くことはありそうです. 7

9.

レンダリングとは ✗ ✗ 88 しかし,そもそも別の部屋の光源であれば,光源からの光がカメラスクリーンに届くわけがありません. このように,光源からの追跡では,スクリーンにヒットする確率は極めて小さいので非効率的です. 8

10.

パストレーシングとは 99 そこでいっそのこと,カメラスクリーンの各ピクセルを始点として経路を構築していきます. この方法で,カメラに入る光の量を計算していくのがパストレーシングです. 9

11.

パストレーシングとは 10 10 当然経路はほかにも無限に存在します. 無限に存在する経路をすべて計算するのは無理なので,ランダムにサンプリングした経路で推定します. 10

12.

パストレーシングとは 色々な経路がある すぐに光源に当たる → ピクセルが明るい なかなか当たらない → ピクセルが暗い 11 11 例えば1ピクセルあたり1経路だけランダムに計算したとします. このとき,すぐに光源に当たるような経路であればピクセルは明るく,逆になかなか当たらない経路であればピクセルは暗くなるでしょう. 11

13.

パストレーシングとは 色々な経路がある すぐに光源に当たる → ピクセルが明るい 1ピクセルあたり1経路計算したパストレーシングの結果 なかなか当たらない → ピクセルが暗い 12 12 この明暗が右のような結果として表れます. 12

14.

パストレーシングとは 経路をどんどん計算していく ・・・ 13 13 そこで,各ピクセルにおいて,この経路の計算を何度もすることで,様々な経路の影響を得ます. 13

15.

パストレーシングとは 経路をどんどん計算していく 1ピクセルあたり1024経路計算したパストレーシングの結果 ・・・ 14 14 例として1024経路計算すれば,右のような画像が得られます. 14

16.

パストレーシングとは 1ピクセルあたり1経路計算した結果 1ピクセルあたり1024経路計算した結果 明暗の差が大 明暗の差が小 →ノイズ大 →ノイズ小 15 15 ここで,1ピクセルあたり1経路計算した場合と,1024経路計算した場合の結果画像を比較してみましょう. 黄色矩形で囲った領域を拡大すると差は一目瞭然で,前者は隣接ピクセル間で明暗の差が大きく,後者は小さくなっています. この明暗の差が小さいほどノイズが少ない結果だ といいます. 15

17.

パストレーシングとは 1ピクセルあたり1経路計算した結果 1ピクセルあたり1024経路計算した結果 リアルタイムに 間に合わない 明暗の差が大 明暗の差が小 →ノイズ大 →ノイズ小 16 16 ノイズの少ない1ピクセルあたり1024経路計算した結果の美しさには目を引かれますが, このような膨大な経路の計算は,リアルタイムには間に合いません. 16

18.

パストレーシングとは 1ピクセルあたり1経路計算した結果 1ピクセルあたり1024経路計算した結果 リアルタイムに 間に合わない 短い時間でノイズを減らす 明暗の差が大 明暗の差が小 →ノイズ大 →ノイズ小 17 17 リアルタイムパストレーシングの目的はいかに短い時間で,左の結果を右の結果に近づけるかになります. つまりノイズの改善が主目的です. 17

19.

パストレーシングの基本:経路のサンプリング 開始 最初のヒット位置はラスタライザで計算済 18 18 ここからはパストレーシングのより具体的な処理について見ていきます. パストレーシングでは,カメラから経路を伸ばしますが,弊社はラスタライザを併用しているのですでに最初のヒット位置が得られています. 18

20.

パストレーシングの基本:経路のサンプリング 方向をサンプリングして次の出射方向を決定 19 19 次のヒット位置を計算するための方向をサンプリングします. 19

21.

パストレーシングの基本:経路のサンプリング ヒット ヒット位置の計算完了 20 20 サンプリングした方向にレイを飛ばして,レイが物体にヒットしました. 20

22.

パストレーシングの基本:経路のサンプリング 方向をサンプリングして次の出射方向を決定 21 21 再度次のヒット位置を計算するための方向をサンプリングします. 21

23.

パストレーシングの基本:経路のサンプリング 以降反復 22 22 以降は同様の処理を反復するだけです. 22

24.

パストレーシングの基本:経路のサンプリング 方向のサンプリングは適当で良い? 23 23 さて,新しいヒット位置を探すための方向のサンプリングですが適当で良いのでしょうか? 23

25.

パストレーシングの基本:経路のサンプリング ✗ 方向のサンプリングは適当で良い? 24 24 まったくもってそうではありません. 24

26.

パストレーシングの基本:経路のサンプリング 材質に注目する ✗ 方向のサンプリングは適当で良い? 25 25 それを知るために材質に注目します. 25

27.

パストレーシングの基本:経路のサンプリング 身の回りの様々な材質 26 26 このようなシーンを使って考えます. 26

28.

パストレーシングの基本:経路のサンプリング 身の回りの様々な材質 ツルツル ザラザラ 27 27 TV画面のようなツルツルした材質もあれば,床のカーペットのようなザラザラした材質もあります. 今,TV画面を確認すると,スタンドが映っています. 27

29.

パストレーシングの基本:経路のサンプリング 身の回りの様々な材質 28 28 試しにこのスタンドが映っている位置でいろいろな方向をサンプリングしてみます. 28

30.

パストレーシングの基本:経路のサンプリング 身の回りの様々な材質 NG NG OK! NG NG 29 29 すると,スタンドが映っている方向以外から入ってきた光はカメラ側に反射されていないことが分かります. つまり特定の方向以外はサンプリングしても意味がありません. 29

31.

パストレーシングの基本:経路のサンプリング 身の回りの様々な材質 NG NG 適当なサンプリングは非効率 OK! NG NG 30 30 従って,方向を適当にサンプリングすることは非効率的です. 30

32.

パストレーシングの基本:BRDF 反射特性に目を向けると… 狭い範囲に反射 広い範囲に反射 光の反射の仕方は材質次第 31 31 そこで,反射の特性に目を向けてみます. ザラザラしたカーペットではある方向からの光が広い範囲に反射されます. 一方でツルツルしたTV画面ではある方向からの光が狭い範囲に反射されます. 31

33.

パストレーシングの基本:BRDF 反射特性に目を向けると… Specular BRDF Diffuse BRDF この特性を表すものがBRDF 32 32 こういった反射特性を表すものをBRDFといい, ザラザラした材質の特性はDiffuse BRDFでよく表され,ツルツルした材質の特性はSpecular BRDFでよく表されます. 32

34.

パストレーシングの基本:BRDFの重点的サンプリング 一様サンプリング • BRDFの大きさを未考慮 • 寄与の小さい方向にも生成 33 33 BRDFを考えることで,一様に方向をサンプリングするほかに,この分布に沿った方向のサンプリングが可能になります. まず,一様な方向のサンプリングは図に示すような状態です. BRDFの大きさを考慮しないので,当然寄与の小さい方向もよく生成してしまい効率が悪いです. 33

35.

パストレーシングの基本:BRDFの重点的サンプリング 一様サンプリング 重点的サンプリング • BRDFの大きさを未考慮 • BRDFの大きさを考慮 • 寄与の小さい方向にも生成 • 寄与の大きい方向ほど高確率 34 34 BRDFが大きな値を持つ範囲の方向を効率よくサンプリングする方法があり,BRDFの重点的サンプリングといいます. 寄与の大きい方向を重点的にサンプリングできるので,ノイズの低減に役立ちます. 34

36.

パストレーシングの基本:BRDFの重点的サンプリング 一様サンプリング 重点的サンプリング • BRDFの大きさを未考慮 • BRDFの大きさを考慮 • 寄与の小さい方向にも生成 • 寄与の大きい方向ほど高確率 ノイズの低減に役立つ 35 35 ここまででとりあえず,パストレーシングを用いてある程度まともな結果をレンダリングすることができそうです. 35

37.

パストレーシングの基本:ノイズが大きくなる環境 BRDFサンプリング 光源 ✗ • 光源にレイが当たらない 限り無意味 • 光源が小さい場合に きわめて非効率的 36 36 BRDFの重点的サンプリングによって経路のサンプリング効率を上げることができますが,対処が難しい問題点があります. 光源が小さい場合レイが光源にヒットしづらいという点です. 36

38.

パストレーシングの基本:ノイズが大きくなる環境 BRDFサンプリング 1ピクセルあたり1経路計算したパストレーシングの結果 光源 ✗ • 光源にレイが当たらない 限り無意味 • 光源が小さい場合に きわめて非効率的 37 37 そのため小さい光源を配置したシーンの場合,1ピクセルあたり1経路計算した結果はノイズが多いものとなります. 37

39.

パストレーシングの基本:ノイズが大きくなる環境 光源 このままでは光源にヒットしないので… 38 38 そこで,ヒットした各位置において… 38

40.

パストレーシングの基本:ノイズが大きくなる環境 光源 光源と明示的に接続する 39 39 光源を明示的にサンプリングして,光源とシェーディング点を直接結んだ経路を作ってしまいます. 39

41.

パストレーシングの基本:ノイズが大きくなる環境 光源 Next Event Estimation 光源と明示的に接続する 40 40 これがNext Event Estimationです. 40

42.

パストレーシングの基本:Next Event Estimation (NEE) NEE 光源 • 光源を明示的に サンプリング (後述) • シェーディング点と接続 • ノイズの改善効果大 41 41 この手法では,光源とシェーディング点の間に遮蔽物がない限り,基本的に寄与を得ることができます. 41

43.

パストレーシングの基本:Next Event Estimation (NEE) NEE 1ピクセルあたり1経路計算したパストレーシングの結果 光源 • 光源を明示的に サンプリング (後述) • シェーディング点と接続 • ノイズの改善効果大 42 42 そのため,かなりノイズが改善された結果を得ることができます. 42

44.

パストレーシングの基本:NEEの具体的な手順 まずは光源表面でサンプリング 光源 計算手順 その1 • 光源表面のどこか1点を ランダムに選択 サンプル 43 43 ではNEEの具体的な計算手順について触れておきます. まずは,光源表面のどこか一点をランダムに選択します. 43

45.

パストレーシングの基本:NEEの具体的な手順 まずは光源表面でサンプリング 光源 計算手順 その1 • 光源表面のどこか1点を ランダムに選択 • 一様に選択するなら生成確率は以下 1/光源の表面積 サンプル 44 44 このとき,サンプルの生成確率はこのようになるでしょう. 44

46.

パストレーシングの基本:NEEの具体的な手順 光源を明示的にサンプリングした後どうする? 距離 光源 計算手順 その2 • 光の減衰量を計算 └ 距離減衰/角度減衰など 45 45 サンプルを生成した後はシェーディング点における寄与を計算します. まず,サンプルとシェーディング点の間の距離を計算し,減衰項を計算します. 45

47.

パストレーシングの基本:NEEの具体的な手順 光源を明示的にサンプリングした後どうする? 距離 光源 計算手順 その2 • 光の減衰量を計算 └ 距離減衰/角度減衰など • サンプル方向と材質情報を使って BRDFの値を計算 BRDF 46 46 次に,シェーディング点からサンプルへの方向と材質の情報を使ってBRDFの値を計算します. 46

48.

パストレーシングの基本:NEEの具体的な手順 光源を明示的にサンプリングした後どうする? 距離 光源 計算手順 その2 • 光の減衰量を計算 └ 距離減衰/角度減衰など • サンプル方向と材質情報を使って BRDFの値を計算 • 以下で寄与を計算 BRDF 光源の明るさ × 光源の色 × BRDF × 減衰項 47 47 これらが計算できたら,この式でこの点における寄与を計算します. 47

49.

パストレーシングの基本:NEEを使う場合と使わない場合の比較 NEE 無効 NEE 有効 比較すると明らかにノイズが改善 48 48 改めて,NEEを利用していない場合と利用した場合とで結果の確認をしてみましょう. 左から右のようにノイズが改善されます. 48

50.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 49 49 ここまでがパストレーシングに関する基本の部分です. ここからは更なるノイズの改善のための手法や問題点をお話しします. まずは多光源環境での問題点からです. 49

51.

NEEの課題:多光源環境 光源をカリングしない場合 • 光源数に比例して処理量が増大 50 50 NEEは前述のようにノイズの改善に非常に役に立ちますが, リアルタイムレンダリングではパフォーマンス面での短所が何点かあります. 一つは存在する光源の数だけ処理をする必要があるということです. 50

52.

NEEの課題:多光源環境 光源をカリングしない場合 • 光源数に比例して処理量が増大 光源をカリングする場合 • ゲーム用光源は影響範囲が局所的 • 影響する光源のみ処理 └ 高速化 51 51 しかし,ゲーム用の光源は絵作りなどのために影響範囲が制限されています. そのため,光源をカリングして影響する光源のみ処理すれば効率が上がります. 51

53.

NEEの課題:多光源環境 → 光源カリング構造の構築 カリング用の構造を構築していく… 影響範囲設定 影響範囲 • アーティストが設定 * 影響範囲は説明のためにAABBで表示 52 52 ということで,カリングをするための構造を構築していきます. シーンにはアーティストが影響範囲を設定した光源が配置されています. ここでは簡単のために,影響範囲をAABBで表現します. 52

54.

NEEの課題:多光源環境 → 光源カリング構造の構築 カリング用の構造を構築していく… 影響範囲設定 影響範囲全体を分割 影響範囲 • アーティストが設定 • 大きなAABBを計算 └ 縦16 横128 奥行128 分割 * 影響範囲は説明のためにAABBで表示 53 53 まず,シーンに存在する各光源のAABBをくっつけて,巨大なAABBを計算します. それを 縦 横 奥行 方向に分割し,グリッドを生成します. 53

55.

NEEの課題:多光源環境 → 光源カリング構造の構築 カリング用の構造を構築していく… 影響範囲設定 影響範囲全体を分割 影響範囲 • アーティストが設定 ビットマスク生成 ビットマスク • 大きなAABBを計算 └ 縦16 横128 奥行128 分割 • 光源ID対応ビットを立てた マスク作成 • サイズは32bitが4つ * 影響範囲は説明のためにAABBで表示 54 54 次にセルにAABBが被る光源のIDを立てたビットマスクを作成します. これでカリング構造ができました. 54

56.

NEEの課題:多光源環境 → 光源カリング構造を用いた照明計算 シェーディングをするには… 光線追跡 • シェーディング点確定 55 55 次に,パストレーシング実行時にカリング構造をどのように参照するかについて説明します. 通常通りパストレーシングを実行し,シェーディング点を確定します. 55

57.

NEEの課題:多光源環境 → 光源カリング構造を用いた照明計算 シェーディングをするには… 光線追跡 ビットマスク取得 ビットマスク • シェーディング点確定 • 位置からセルを特定 • セルからビットマスク取得 56 56 次にシェーディング点の座標が属するセルを特定し,ビットマスクを取り出します. 56

58.

NEEの課題:多光源環境 → 光源カリング構造を用いた照明計算 シェーディングをするには… 光線追跡 ビットマスク取得 記録された光源を処理 2 7 ビットマスク No.2 No.7 • シェーディング点確定 • 位置からセルを特定 • 光源ID取得 • セルからビットマスク取得 • シェーディング 57 57 ビットマスクを取り出したら,処理すべき光源のIDを使ってシェーディングをします. 57

59.

NEEの課題:多光源環境 → 光源カリング構造を用いた照明計算 シェーディングをするには… 光線追跡 ビットマスク取得 記録された光源を処理 2 7 ビットマスク 処理する光源数を削減 • シェーディング点確定 No.2 No.7 • 位置からセルを特定 • 光源ID取得 • セルからビットマスク取得 • シェーディング 58 58 これにより,NEEにて処理すべき光源の数を,かなり減らすことができました. 58

60.

NEEの課題:遮蔽判定 NEEでは光源上を明示的にサンプルしていた 影響 アリ 生成されたサンプルは 必ずシェーディング点に 影響する? 影響 アリ 影響 アリ 影響 アリ 影響 アリ 59 59 次の課題に移ります. NEEは光源の表面にサンプルを生成し,シェーディング点と接続して寄与を計算するものでした. さて,このとき生成したサンプルはシェーディング点に必ず影響するでしょうか? 59

61.

NEEの課題:遮蔽判定 NEEでは光源上を明示的にサンプルしていた 影響 アリ 生成されたサンプルは 必ずシェーディング点に 影響する? 影響 アリ 影響 アリ 影響 アリ 影響 アリ 60 60 そうとは限りません. 60

62.

NEEの課題:遮蔽判定 • 間に遮蔽物があれば影響ナシ! 影響 アリ 影響 アリ 影響 アリ 影響 アリ 影響 ナシ 61 61 このように遮蔽物が存在する場合,そのサンプルは影響しません. 61

63.

NEEの課題:遮蔽判定 • 間に遮蔽物があれば影響ナシ! 影響 アリ • どう遮蔽判定? 影響 アリ 影響 アリ 影響 アリ 影響 ナシ • シェーディング点から光線追跡 └ 重い処理 62 62 であれば,シェーディング点とサンプル間に遮蔽物があるかを調べる必要があります. 遮蔽物があるかどうかは,シェーディング点からサンプルに向かって追加で光線追跡をすれば判定できます. これはそれなりに重い処理になります. 62

64.

NEEの課題:遮蔽判定 サンプルの数が増えてくると? • 光線追跡回数が増大 • リアルタイム処理は困難 63 63 そのため,サンプルの数が増えてくればこの処理時間は見過ごせないものになります. リアルタイムレンダリングを行うためには何か工夫が必要です. 63

65.

NEEの課題:遮蔽判定 サンプルの数が増えてくると? • 光線追跡回数が増大 • リアルタイム処理は困難 • ランダムに1つだけ処理 64 64 そこでまずランダムに1つだけ選択して処理することで,全体の影響を推定することを考えてみます. 64

66.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える 65 65 いま説明のためにこういった5つのサンプルが存在する状況を考えます. 65

67.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える • サンプル群から一様に1つ選択 66 66 このうち,どれかのサンプルを一様に選択します. 同じ大きさで塗り分けられた棒にランダムにダーツを投げるイメージです. 66

68.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える • サンプル群から一様に1つ選択 • 選択されたサンプルを評価 67 67 このときダーツが刺さった場所の色が選択されたサンプルを表します. この選択された1サンプルのみ評価を行えば良いです. 67

69.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える 寄与 寄与 0.1 0.1 寄与 0.5 • サンプル群から一様に1つ選択 寄与 0.2 寄与 0.1 • 選択されたサンプルを評価 重要 68 68 しかし,もし各サンプルの寄与があったとしてこのような値だった場合この方法の効率はどうでしょうか. 68

70.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える 寄与 寄与 0.1 0.1 寄与 0.5 • サンプル群から一様に1つ選択 寄与 0.2 寄与 0.1 重要 • 選択されたサンプルを評価 • 重要ではないものも頻繁に選択 69 69 寄与0.5の薄ピンク色のサンプルを重点的に選ぶ方が良いですが, すべてのサンプルを同じ確率で選択するので効率がよくありません. 69

71.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える 寄与 寄与 0.1 0.1 寄与 0.5 • サンプル群から一様に1つ選択 寄与 0.2 寄与 0.1 こちらを 使うべき! 重要 • 選択されたサンプルを評価 • 重要ではないものも頻繁に選択 70 70 ダーツを投げる棒は,寄与に応じて領域が割り振られたものを使うほうがよさそうです. 70

72.

NEEの課題:遮蔽判定 サンプルが5つある状況を考える 寄与 寄与 0.1 0.1 寄与 • サンプル群から一様に1つ選択 寄与 0.2 寄与 0.1 0.5 こちらを • 選択されたサンプルを評価 Resampled Importance Sampling 使うべき! 重要 • 重要ではないものも頻繁に選択 71 71 そこで登場するのが Resampled Importance Sampling (RIS) という手法です. 71

73.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) 光源をサンプリング • サンプルを生成 72 72 まずはいつも通り光源をサンプリングしてサンプルを生成します. 72

74.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの重み計算と保存 重み • サンプルの重み(寄与)を計算 └ NEEなら以下をもとに計算 重み 0.1 0.1 重み 0.5 重み 0.2 重み 0.1 光源の明るさ × 光源の色 × BRDF × 減衰項 73 73 次にサンプルの重みを計算します. NEEであればそこから出ていく光をもとに計算します.この計算はすでに説明した通りです. 73

75.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの重み計算と保存 重み • サンプルの重み(寄与)を計算 └ NEEなら以下をもとに計算 重み 0.1 0.1 重み 0.5 重み 0.2 重み 0.1 0.5 0.1 光源の明るさ × 光源の色 × BRDF × 減衰項 • 重みとサンプルの情報はメモリに保存 • 総重みも計算(今回は1) 0.1 0.2 0.1 メモリ 74 74 この重みと,サンプルの情報はすべてメモリに保存します. さらに総重みも計算します. 今回の例であれば,1です. 74

76.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの重み計算と保存 重み • サンプルの重み(寄与)を計算 └ NEEなら以下をもとに計算 重み 0.1 0.1 重み 0.5 重み 0.2 重み 0.1 0.5 0.1 光源の明るさ × 光源の色 × BRDF × 減衰項 • 重みとサンプルの情報はメモリに保存 • 総重みも計算(今回は1) 0.1 0.2 0.1 メモリ 75 75 すると重みに比例した⾧さの領域をサンプルごとに割り当てた棒を作ることができます. 75

77.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) 再サンプリング 重み • サンプルの重み(寄与)を計算 └ NEEなら以下をもとに計算 重み 0.1 0.1 重み 0.5 重み 0.2 選択確率 重み 0.1 重み 0.5 総重み 1 0.5 0.1 0.1 光源の明るさ × 光源の色 × BRDF × 減衰項 • 重みとサンプルの情報はメモリに保存 • 総重みも計算(今回は1) • サンプルは重みに比例した確率で選択 0.2 0.1 メモリ 76 76 この棒にランダムにダーツを投げれば,広い領域ほど当たるので,サンプルは重みに比例した確率で選択されます. 以上により,遮蔽計算を1回にしつつ,重要なサンプルを重点的に評価できるようになりました. 76

78.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの数が増えてくると? 77 77 しかしこの手法は,サンプルが増えてくると問題を生じます. 77

79.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの数が増えてくると? 膨大 • 膨大なメモリが必要 • ライトが多い場所では絶望的 メモリ 78 78 再サンプリングするまでに,処理したすべてのサンプルを記憶する必要があるので,メモリを大量に消費します. ライトが多いシーンになるほどサンプル数は増えていくので,このアルゴリズムを利用することは困難です. 78

80.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの数が増えてくると? 膨大 • 膨大なメモリが必要 • ライトが多い場所では絶望的 • 改善された アルゴリズムが存在 メモリ 79 79 このような点について改良が施されたアルゴリズムがあります. 79

81.

NEEの課題:遮蔽判定 → Resampled Importance Sampling (RIS) サンプルの数が増えてくると? 膨大 • 膨大なメモリが必要 • ライトが多い場所では絶望的 Streaming RIS 23.28 cm • 改善された アルゴリズムが存在 メモリ 80 80 それがStreaming RISです. 80

82.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • 1つサンプルを生成 重み • 重みを計算 1 メモリの状態 81 81 この手法の手順を確認します. まず,1つだけサンプルを生成し,同様に重みを計算します. メモリの状態も同時に追っていきましょう. 81

83.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • 1つサンプルを生成 重み • 重みを計算 1 • 重み和を更新 重み和 0+1 メモリの状態 82 82 メモリには処理したサンプルの重みを加算していく領域を用意しておきます. 今回が初めての処理なので,この値は今生成した重みの値になります. 82

84.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 • 1つサンプルを生成 重み • 重みを計算 1 重み和 0+1 選択・格納 • 重み和を更新 重み和 1 メモリの状態 83 83 つまり,1になりました. 83

85.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 1 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 1 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 重み和 0+1 重み和 1 メモリの状態 84 84 このとき,新しい黄色サンプルを,この重みが重み和に占める割合に応じて選択します. 84

86.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 1 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 1 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 重み和 0+1 重み和 1 メモリの状態 85 85 その割合は1であり,相手のサンプルはいないので黄色サンプルが不戦勝です. 85

87.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 1 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 1 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 格納 重み和 0+1 重み和 1 重み 重み和 1 1 メモリの状態 86 86 メモリに黄色サンプルを格納します.次のサンプルに進みます. 86

88.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • 1つサンプルを生成 重み • 重みを計算 1 重み 重み和 1 1 メモリの状態 87 87 また,1つだけサンプルを生成し,同様に重みを計算します. 87

89.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • 1つサンプルを生成 重み • 重みを計算 1 • 重み和を更新 重み 重み和 1 1+1 メモリの状態 88 88 重み和を更新します. 88

90.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 • 1つサンプルを生成 重み • 重みを計算 1 重み 重み和 1 1+1 選択・格納 • 重み和を更新 重み 重み和 1 2 メモリの状態 89 89 今回は2になりました. 89

91.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 1 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 2 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 重み 重み和 1 1+1 重み 重み和 1 2 メモリの状態 90 90 このとき,新しい緑色サンプルを,この重みが重み和に占める割合に応じて選択します. 90

92.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 1 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 2 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 重み 重み和 1 1+1 重み 重み和 1 2 メモリの状態 91 91 今回は,メモリに入っている黄色サンプルが勝者となりました. 91

93.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 勝率 • 1つサンプルを生成 1 2 • 重みを計算 重み 1 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 維持 重み 重み和 1 1+1 重み 重み和 1 2 重み 重み和 1 2 メモリの状態 92 92 この場合メモリに入っている黄色サンプルはそのままです. 次に来るサンプルに関しても同様の処理をします. 92

94.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 3 勝率計算 選択・格納 勝率 • 1つサンプルを生成 3 5 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 重み 重み和 1 2+3 重み 重み和 1 5 メモリの状態 93 93 今回は,メモリに入っている黄色サンプルに青色サンプルが勝利しました. 93

95.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 重み 3 勝率計算 選択・格納 勝率 • 1つサンプルを生成 3 5 • 重みを計算 • 重み和を更新 • 重みに比例した確率で 新しいサンプルに変更 更新 重み 重み和 1 2+3 重み 重み和 1 5 重み 重み和 3 5 メモリの状態 94 94 この場合黄色サンプルは捨てられて青色サンプルに置き換わります. こういった操作を最後のサンプルまで反復します. 94

96.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • メモリのサンプルは 以下で選択された場合と同等 勝率 重み 3 興味深い性質 3 5 1 1 3 更新 重み 重み和 1 2+3 重み 重み和 1 5 メモリ 重み 重み和 3 5 メモリの状態 95 95 この処理には興味深い性質があります. メモリにあるサンプルは,RISのように重みに比例して選択されたサンプルになっています. 95

97.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • メモリのサンプルは 以下で選択された場合と同等 勝率 重み 3 興味深い性質 3 5 1 1 3 更新 重み 重み和 1 2+3 重み 重み和 1 5 メモリ 重み 重み和 3 5 特徴 • 1サンプルのみ記憶 メモリの状態 96 96 しかも,この処理を行うにあたって,メモリには1サンプルしか記憶する必要がありません. 96

98.

NEEの課題:遮蔽判定 → Streaming RIS サンプル生成 勝率計算 選択・格納 • メモリのサンプルは 以下で選択された場合と同等 勝率 重み 3 興味深い性質 3 5 1 本パストレーサの根幹 1 3 更新 重み 重み和 1 2+3 重み 重み和 1 5 メモリ 重み 重み和 3 5 特徴 • 1サンプルのみ記憶 メモリの状態 97 97 このアルゴリズムは,弊社のパストレーサの根幹を担っています. 97

99.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 • 重みはシェーディング点における 寄与をもとに計算 重み 1 重み 0 重み 2 重み 5 重み 0 98 98 RISとStreaming RISのお話をここまでしてきました. さて,このとき計算していた重みはシェーディング点における寄与がもとになっていました. 98

100.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 • 重みはシェーディング点における 寄与をもとに計算 重み 1 • 正しい寄与の計算には遮蔽計算が必要 重み 0 重み 2 重み 5 • サンプルが増えてくると処理量大 重み 0 99 99 しかし,この値を厳密に計算するには遮蔽を評価する必要があるのでした. RISを導入する際の目的が遮蔽計算を減らすことでしたので, ここで遮蔽を計算してしまうと,本末転倒です. 99

101.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 • 遮蔽を無視した寄与をもとに 重みを計算 重み 1 重み • 遮蔽計算をしないので 高速にサンプルを生成可能 重み • デメリットが存在 2 重み 2 重み 5 3 100 100 そこで思い切って,重みを計算するときに 遮蔽を無視してしまいます. これによってサンプルごとに遮蔽の計算をする必要がなくなるので高速にサンプルの生成を行うことができます. しかし,遮蔽を無視することによる弊害があります. 100

102.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 重み 100 重み • 非常に明るいサンプルが 存在するときに問題 • 選択確率を支配 100 / (100+2+5+1+2+3) =88.5 % 1 重み 2 重み 2 重み 5 重み 3 101 101 今,重みが100になるサンプルがシーンに存在したとしましょう. このサンプルはほぼ9割の確率で選択されます. 101

103.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 重み 100 重み • 選択確率を支配 100 / (100+2+5+1+2+3) =88.5 % 1 重み 2 重み 2 重み 5 • 非常に明るいサンプルが 存在するときに問題 重み 3 • 遮蔽されるので無意味 • ノイズ大 102 102 しかし,このサンプルは遮蔽されてしまうので,無意味なサンプルです. この場合,凄まじいノイズがレンダリング結果に生じます. 102

104.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 問題となるシーンを屋外から見た様子 明るい光源 103 103 『バイオハザード レクイエム』におけるケースを確認してみます. 屋外の明るい光源が廊下を照らしているシーンです. 103

105.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 問題となるシーンを屋外から見た様子 注目 明るい光源 104 104 この黄色矩形で囲った廊下部分を確認します. 104

106.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 問題となるシーンを屋外から見た様子 問題となる廊下のシーン 演出用光源 注目 ノイズ小 ノイズ大 明るい光源 105 105 廊下シーンでは演出用の光源が廊下を照らしています. 黄色矩形で囲った部分はノイズが少ないですが,この明るい光源の照射範囲にある赤色矩形の部分では凄まじいノイズになっています. 105

107.

NEEの課題:遮蔽判定 → RISで遮蔽を無視する弊害 問題となるシーンを屋外から見た様子 問題となる廊下のシーン 演出用光源 注目 ノイズ小 ノイズ大 明るい光源 このノイズを改善したい 106 106 このノイズを改善することを考えます. 106

108.

NEEの課題:遮蔽判定 → RISの重み変更 重み グラフの概形 𝑤= 𝑤 寄与に比例した重み𝑤 𝛼:調整係数 特徴 • 明るい光源の選択確率大 𝑂 𝑤 107 107 行うことは,RISにおける重みの変更です. パストレーサの実装当初に利用していた重みは,光源の寄与に対して感度が高いものでした. その為,明るい光源を選択しすぎる問題がありました. 107

109.

NEEの課題:遮蔽判定 → RISの重み変更 重み 𝑤= グラフの概形 𝑤 1 + 𝛼𝑤 𝑤 𝛼:調整係数 特徴 • 暗い光源の選択確率上昇 𝑂 𝑤 108 108 そこで,こういった環境でも暗い光源が選択されるようにするために, 増減がなだらかになるように重みの式を変更し,さらに調整係数を導入しました. これにより,極端に明るい光源が選ばれにくくなります. 108

110.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼を固定してシーンを変えた場合… 調整を行ったシーン 𝑤 ほどよく 分布 𝑂 𝑤 109 109 ただし,このままでは問題が発生します. 例えばあるシーンで調整係数を設定し,良好な結果が得られたとしましょう. つまり左のグラフのように明るい光源と暗い光源の重みが分布している状態です. この調整係数のまま,もっと暗いシーンに行ってみます. 109

111.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼を固定してシーンを変えた場合… 調整を行ったシーン 𝑤 暗いシーン 𝑤 ほどよく 分布 𝑂 調整が 無意味 𝑤 𝑂 𝑤 110 110 全体的に暗いということは,どちらの光源も,寄与に比例した値が小さくなります. すると,グラフの左寄りのエリアばかりが利用されてしまいます. このエリアは線形なので,このままでは最初に回避したかった明るい光源が選ばれすぎる問題が再発してしまいます. 110

112.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼を固定してシーンを変えた場合… 調整を行ったシーン 𝑤 ほどよく 分布 暗いシーン 𝑤 何か対策は? 𝑂 調整が 無意味 𝑤 𝑂 𝑤 111 111 場所によってこのパラメータを調整することは現実的ではありません. 何か対策はないでしょうか? 111

113.

NEEの課題:遮蔽判定 → RISの重み変更 重み グラフの概形 𝑤 ⁄𝐸 𝑤= 1 + 𝛼 𝑤 ⁄𝐸 𝑤 ほどよく分布 𝛼:調整係数 𝐸:カメラの露出 特徴 • カメラの露出の導入により 様々な明るさのシーンに適応 • 明るいシーン,暗いシーンともに 重みの分布がほどよい状態 𝑂 𝑤 112 112 ゲームシーンでは,画面の明るさに応じてカメラの露出を適切に変更しています. そこで,この値も利用することで,シーンに依存せずに重みがほどよく分布するようになりました. この形の重みを今回のパストレーサでは利用しています. 112

114.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼=0 113 113 パラメータ𝛼の値に応じたノイズ量の変化例を示します. 𝛼=0はノイズが極めて多い領域が存在することが容易にわかります. 113

115.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼=0 𝛼=4 𝛼 を大きくしていくとノイズが改善 114 114 𝛼=4ではその領域のノイズが少し改善されたように見えます. 114

116.

NEEの課題:遮蔽判定 → RISの重み変更 𝛼=0 𝛼=4 𝛼=16 𝛼 を大きくしていくとノイズが改善 115 115 𝛼=16 まで変化させると,神経質なノイズはかなり落ち着き, 𝛼=0と比べればかなり安定した結果になっているように見えます. 115

117.

NEEの課題:遮蔽判定 → RISの重み変更 採用! 𝛼=0 𝛼=4 𝛼=16 𝛼=2000 … ノイズ増 𝛼 を大きくしすぎるとノイズ増… 116 116 しかし,大きくしすぎると一様にサンプルを選択している状態と同じになるのでかえってノイズを増やしてしまいます. そのため,タイトルではαの値に16を採用しました. 116

118.

Streaming RIS:例外処理 Directional Light 重み 100 重み • あらゆる面を照らす 極端に明るい光源 • ほぼ確実に再サンプリング 1 重み • 調整重みの活用である程度は改善 └ 限度がある 2 重み 2 重み 5 重み 3 117 117 ここからはStreaming RISの運用上の例外処理についてです. Directional Lightは,きわめて明るいので再サンプリング時に非常に選ばれやすいです. もちろん,前述した調整済みの重みによってある程度の改善が見られましたが限度がありました. 117

119.

Streaming RIS:例外処理 Directional Light 単独評価 • Directional LightはRISなしで 1サンプルで評価 └ 遮蔽計算回数は増加 └ 直接照明計算時のみ この例外処理を採用 118 118 そこで,Directional Lightに関しては,直接照明計算時のみRISは利用せずに寄与を評価することにしました. ノイズが改善しますが,遮蔽計算回数は増加します. 118

120.

Streaming RIS:例外処理 Cube Map (Image Based Lighting) 重み 10 重み 10 重み 100 重み 100 重み • 晴天画像を利用すると, Directional Lightと似た問題が発生 1 重み 2 重み 2 重み 5 重み 3 119 119 Directional Lightと同様に,Cube Mapをつかったライティング,Image Based Lightingでも同様の問題が起こる場合があります. 画像に晴天画像を用いている場合,特定のピクセルがきわめて明るいので,Directional Lightと同じ問題になります. 119

121.

Streaming RIS:例外処理 Cube Map (Image Based Lighting) RISを実行 • Cube MapのみでRISを実行 RISを実行 └ 遮蔽計算回数は増加 └ 直接照明計算時のみ この例外処理を採用 120 120 そこで,Cube Mapのサンプルに関しては直接照明計算時のみ単独でRISを行って寄与を評価することにしました. こちらも遮蔽計算回数は増加しますが,ノイズは当然改善します. 120

122.

Streaming RIS:Cube Mapのサンプルの例外処理の有効時・無効時の比較 例外処理 無効 例外処理 有効 ノイズが改善 121 121 Cube Mapのサンプルの例外処理を『プラグマタ』で用いた場合の改善例がこちらです. 例外処理をしていない場合はノイズがかなり多いですが,例外処理を有効にした場合はノイズがかなり改善されています. ここまではRISの品質面の問題や対策を説明してきました. 次は,RISの計算量を減らす取り組みについて説明します. 121

123.

Streaming RIS:サンプル生成時の計算量低減 おさらい • 以下をもとに重みを計算 重み 1 重み 2 重み 2 重み 5 光源の明るさ × 光源の色 × BRDF × 減衰項 • ↑の計算が重みの計算ごとに実行 重み 3 122 122 Streaming RISでは,サンプルの評価をするたびに重みの計算をしていました. 122

124.

Streaming RIS:サンプル生成時の計算量低減 おさらい • 以下をもとに重みを計算 重み 重み 1 重み 重み 5 2 重み 2 重み 2 重み 1 3 重み 5 重み 2 光源の明るさ × 光源の色 × BRDF × 減衰項 • ↑の計算が重みの計算ごとに実行 重み 3 123 123 サンプルが増えてくると,この計算も無視できないものになります. 123

125.

Streaming RIS:サンプル生成時の計算量低減 おさらい • 以下をもとに重みを計算 重み 重み 1 重み 重み 5 2 重み 2 重み 2 重み 1 3 重み 5 重み 2 光源の明るさ × 光源の色 × BRDF × 減衰項 • ↑の計算が重みの計算ごとに実行 重み 3 • 重みはサンプルの価値 • 計算を簡略化可能 124 124 しかし,重みというものはRISにおけるそのサンプルの価値でしかありません. 本来計算したい値と大きく異ならなければ,ある程度簡略化してもよいものです. 124

126.

Streaming RIS:サンプル生成時の計算量低減 サンプル生成時 (複数回実行) • 以下をもとに重みを計算 重み 重み 1 重み 重み 5 2 重み 2 重み 2 重み 1 3 重み 5 重み 2 重み 3 光源の明るさ × 光源の色 × 軽量版BRDF(完全拡散など) × 減衰項 シェーディング時 (1回のみ実行) • 以下をもとにシェーディング 光源の明るさ × 光源の色 × BRDF × 減衰項 125 125 そこで,サンプルを生成するとき重みの計算では軽量版のBRDFを用いました. Diffuse BRDFであれば完全拡散モデルを用いるなどです. 完全なBRDFの計算はシェーディング時に初めて行います. 125

127.

Streaming RIS:サンプル生成時の計算量低減 サンプル生成時 (複数回実行) • 以下をもとに重みを計算 重み 重み 1 重み 重み 5 2 重みの計算量が改善 重み 2 重み 2 重み 1 3 光源の明るさ × 光源の色 × 軽量版BRDF(完全拡散など) × 減衰項 重み 5 重み 2 重み 3 シェーディング時 (1回のみ実行) • 以下をもとにシェーディング 光源の明るさ × 光源の色 × BRDF × 減衰項 126 126 これにより重みの計算が軽量化しました. 126

128.

Streaming RIS:サンプル生成時の計算量低減 サンプル生成 勝率計算 選択・格納 • 勝率にもとづいて 勝者を決定 勝率 重み 3 おさらい 3 5 • 塗り分けた棒にダーツ一投 • 刺さった側が勝者 重み 重み和 1 2+3 重み 重み和 1 5 重み 重み和 3 5 メモリの状態 127 127 重みの計算量を低減できたので,もう一点計算量の低減を行います. おさらいになりますが,Streaming RISではこのような計算をしていました. 127

129.

Streaming RIS:サンプル生成時の計算量低減 サンプル生成 勝率計算 選択・格納 • 勝率にもとづいて 勝者を決定 勝率 重み 3 おさらい 3 5 • 塗り分けた棒にダーツ一投 • 刺さった側が勝者 • 選択時に乱数生成 重み 重み和 1 2+3 重み 重み和 1 5 重み 重み和 3 5 メモリの状態 128 128 塗り分けた棒のどこに刺さるのかは乱数を生成して決めることになります. 128

130.

Streaming RIS:サンプル生成時の計算量低減 サンプルの数が多いと…? あと何回… 何度も乱数を生成しないといけない! 129 129 つまり,サンプルの数が増えてくると,何度も乱数を生成する必要があります. この回数を減らすことを考えます. 129

131.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 𝑢 0 𝑢 :n回目に利用する乱数 130 130 最初はいつも通り,乱数を生成します. 130

132.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 1. 今生成された乱数 投げない 𝑢 0 以降は… 2. 勝率 3. 勝敗結果 の3要素で乱数を決めていく[1] 𝑢 :n回目に利用する乱数 131 131 しかし以降は乱数生成器を用いません. 以降は,今生成された乱数,勝率,および勝敗結果を使って次の乱数を決めていきます. 131

133.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 投げない 勝利 (𝑢 < 𝑝) 1 勝率 𝑝 𝑢 0 𝑢 :n回目に利用する乱数 𝑢 0 132 132 具体的な手順を確認しましょう. 勝利した場合,つまり乱数が,勝率pの棒より下にあるときです. 132

134.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 投げない 勝利 (𝑢 < 𝑝) 1 𝑢 勝率 𝑝 𝑢 𝑢 𝑢 = 0 𝑢 :n回目に利用する乱数 𝑢 𝑝 0 133 133 今生成された乱数に,このような変換をして条件付き一様乱数を再構成します. 133

135.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 投げない 勝利 (𝑢 < 𝑝) 1 1 𝑢 勝率 𝑝 𝑢 𝑢 = 𝑢 𝑢 :n回目に利用する乱数 0 𝑢 −𝑝 1−𝑝 𝑢 𝑢 = 0 敗北 (𝑢 ≥ 𝑝) 𝑢 𝑝 勝率 𝑝 𝑢 0 134 134 敗北した場合も似たような変換で値を計算します. 134

136.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 助かった 勝利 (𝑢 < 𝑝) 1 1 𝑢 勝率 𝑝 𝑢 𝑢 𝑢 𝑢 :n回目に利用する乱数 0 = 𝑢 −𝑝 1−𝑝 𝑢 𝑢 0 敗北 (𝑢 ≥ 𝑝) = 𝑢 𝑝 勝率 𝑝 𝑢 0 以降も同様に条件付きの一様乱数を再構成 135 135 以降,同様の計算を行います. 135

137.

Streaming RIS:サンプル生成時の計算量低減 1 最初だけ 乱数を作ってもらう 助かった 勝利 (𝑢 < 𝑝) 敗北 (𝑢 ≥ 𝑝) 1 1 𝑢 𝑢 −𝑝 1−𝑝 乱数生成器呼び出し回数が1回に 勝率 𝑝 𝑢 𝑢 𝑢 𝑢 𝑢 0 𝑢 :n回目に利用する乱数 0 = = 𝑢 𝑝 勝率 𝑝 𝑢 0 以降も同様に条件付きの一様乱数を再構成 136 136 つまり,サンプルを選択するときに利用する乱数生成器の利用回数を「1回」にすることができました. 136

138.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 137 137 ここまでは光源やIBLなどに対するNEEを扱っていましたが,一方でゲーム内には自発光をするポリゴンも光源の要素となります. 次にNEEの対象をEmissive Polygonにも拡張する話をします. 137

139.

Emissive PolygonのNEE Emissive Polygonのみで照明したシーンを利用 NEEなし NEEあり ノイズ大 ノイズが大幅に改善 実際のゲームシーンとは異なります 138 138 まずは,『プラグマタ』の拠点において,Emissive Polygonによる照明のみの状態での比較を見てみましょう. 通常の光源のNEEの場合と同じく,Emissive PolygonもNEEを利用することでノイズが改善しています. 138

140.

Emissive PolygonのNEE いままで考えてきた光源には影響範囲が設定されていた 影響範囲 範囲 制限アリ 139 139 さて,いままで考えてきた光源には影響範囲が設定されていました. 139

141.

Emissive PolygonのNEE いままで考えてきた光源には影響範囲が設定されていた 影響範囲 範囲 制限アリ カリング構造 • NEEのタイミングで 必要な光源だけ参照可能 • NEEでの無駄の削減! 140 140 これにより,カリング構造を作成することが可能になり,NEEのタイミングで本当に必要な光源だけを取得することができていました. 140

142.

Emissive PolygonのNEE いままで考えてきた光源には影響範囲が設定されていた 影響範囲 カリング構造 範囲 制限アリ • NEEのタイミングで 必要な光源だけ参照可能 • NEEでの無駄の削減! Emissive Polygonの場合はどうなる? 141 141 Emissive Polygonの場合はどうなるでしょうか? 141

143.

Emissive PolygonのNEE Emissive Polygonには影響範囲を設定できない! 影響範囲 • 影響範囲に制限がないので… 範囲 制限ナシ 142 142 Emissive Polygonは,先ほどまで紹介してきた光源とは異なり影響範囲を制限できません. 142

144.

Emissive PolygonのNEE Emissive Polygonには影響範囲を設定できない! 影響範囲 カリング構造 • 影響範囲に制限がないので… └ 光源のカリング構造は 流用不可 範囲 制限ナシ 143 143 つまり,通常の光源に用いていたカリング構造は流用できません. 143

145.

Emissive PolygonのNEE Emissive Polygonには影響範囲を設定できない! 影響範囲 範囲 制限ナシ カリング構造 • 影響範囲に制限がないので… └ 光源のカリング構造は 流用不可 • Emissive Polygonは シーン中に大量に存在 └ 光源の比ではない数 144 144 また,Emissive Polygonはシーン中に大量に存在します. 144

146.

Emissive PolygonのNEE Emissive Polygonには影響範囲を設定できない! 影響範囲 範囲 制限ナシ カリング構造 • 影響範囲に制限がないので… └ 光源のカリング構造は 流用不可 • Emissive Polygonは シーン中に大量に存在 └ 光源の比ではない数 • 少数のサンプルで 精度よく影響を推定 145 145 そこで,すべてのEmissive Polygonを見るのではなく,少数のEmissive Polygonによって推定します. このとき,精度よく推定を行うには重要度の高いものを,重点的にサンプリングする必要があるでしょう. 145

147.

Emissive PolygonのNEE Emissive Polygonには影響範囲を設定できない! 影響範囲 カリング構造 • 影響範囲に制限がないので… └ 光源のカリング構造は 流用不可 Walker’s Alias Method 23.28 cm 範囲 制限ナシ • Emissive Polygonは シーン中に大量に存在 └ 光源の比ではない数 • 少数のサンプルで 精度よく影響を推定 146 146 そこで我々は,’Walker’s Alias Method’ を使うことにしました. これは高速に重点的サンプリングを行うことができる手法です. 146

148.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 重みの計算 重み 0 1 2 3 4 5 6 7 8 9 サンプル番号 • サンプルごとに重み計算 147 147 この手法では,まず各Emissive Polygonの明るさに比例した重みを計算しておきます. 147

149.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method テーブル構築 重みの計算 重み 0 1 2 3 4 5 6 7 8 サンプル番号 • サンプルごとに重み計算 9 0 1 2 3 4 5 6 7 8 9 サンプル番号 • 重みが平均以上のものから 重みを分配 • GPUで実行[2] 148 148 重みが平均以上になっているサンプルから,重みを他へ分配していきます.詳細は参考文献などをご覧ください. 148

150.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method テーブル構築 重みの計算 テーブル完成 重み 0 1 2 3 4 5 6 7 8 サンプル番号 • サンプルごとに重み計算 9 0 1 2 3 4 5 6 7 8 9 サンプル番号 • 重みが平均以上のものから 重みを分配 0 1 2 3 4 5 6 7 8 9 ペア番号 • 重みに比例した サンプリングが可能 • GPUで実行[2] 149 149 こういった操作によって構築されたテーブルで重みに比例したサンプリングが実現できます. 149

151.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 処理手順 ペアの選択 • ペア番号をランダム選択 0 1 2 3 4 5 6 7 8 9 ペア番号 150 150 では,実際にサンプリングを行う際の手順を示します. 今回の例であれば,まず10種類あるペアのうちどれか1つをランダムに選択します. 150

152.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 処理手順 ペアの選択 • ペア番号をランダム選択 4 0 1 2 3 4 5 6 7 8 9 ペア番号 151 151 今回は4番ペアが選択されました. 151

153.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 処理手順 ペアの選択 • ペア番号をランダム選択 4 5 4 0 1 2 3 4 5 6 7 8 9 ペア番号 152 152 4番のペアを確認します. これは4番と5番のサンプルの値で構成されたペアです. 152

154.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 処理手順 サンプル番号の選択 ペアの選択 • ペア番号をランダム選択 • ペア内の重みに比例した 確率でサンプル選択 4 5 4 0 1 2 3 4 5 ペア番号 6 7 8 9 0 1 2 3 4 5 6 7 8 9 サンプル番号 153 153 次に,また乱数を生成し,このペア内の重みに比例した確率でサンプルを選択します. 153

155.

Emissive PolygonのNEE → 基盤となる手法 Walker’s Alias Method 処理手順 サンプル番号の選択 ペアの選択 • ペア番号をランダム選択 5! • ペア内の重みに比例した 確率でサンプル選択 4 特徴 • 乱数2つで 重点的サンプリング 5 4 0 1 2 3 4 5 ペア番号 6 7 8 9 0 1 2 3 4 5 6 7 8 9 サンプル番号 154 154 このように一度テーブルを作ってしまえば,乱数2つを生成するだけで,重点的サンプリングが行えます. 154

156.

Emissive PolygonのNEE → サンプリング構造の構築 サンプリング用の構造を構築していく… ゲームシーン サブメッシュ0 サブメッシュ1 サブメッシュ2 155 155 我々はこのような’Walker’s Alias Method’ によって生成されるテーブルを, 各ジオメトリとマテリアルの組となるサブメッシュ単位にまず構築しました. 155

157.

Emissive PolygonのNEE → サンプリング構造の構築 サンプリング用の構造を構築していく… ゲームシーン ポリゴン選択用テーブル構築 サブメッシュ0 サブメッシュ2 ・・・ ・・・ サブメッシュ1 ・・・ サブメッシュ0 サブメッシュ1 重み サブメッシュ2 各ポリゴン面積 構築タイミング 最初の1回 156 156 各要素はEmissive Triangleであり,各ポリゴンの面積を重みとしてテーブルを構築しています. この面積が大きく変化することは基本的にないと考え,これらのテーブルは1度だけ構築することにしています. さらに,これらのテーブルの1フレームあたりの構築数は数個に絞っています. 156

158.

Emissive PolygonのNEE → サンプリング構造の構築 サンプリング用の構造を構築していく… ゲームシーン ポリゴン選択用テーブル構築 サブメッシュ選択用テーブル構築 サブメッシュ0 サブメッシュ2 ・・・ ・・・ サブメッシュ1 サブメッシュ ・・・ サブメッシュ0 サブメッシュ1 サブメッシュ2 ・・・ 0 1 2 ・・・ 重み 重み 各ポリゴン面積 サブメッシュ総面積× マテリアルの発光の強さ 構築タイミング 構築タイミング 最初の1回 重み変化時 157 157 サブメッシュの中をサンプリングするためのテーブルができたので, 次はこの各サブメッシュをサンプリングするためのテーブルを構築します. 重みはサブメッシュの総面積と,マテリアルの発光の強さ(放射強度)の積となります. こちらは重みが変化したタイミングで構築を行います. 157

159.

Emissive PolygonのNEE → サンプリング構造の運用 シェーディングをするには… サブメッシュを選択 サブメッシュ0 サブメッシュ1 サブメッシュ2 ・・・ サブメッシュ選択用テーブル 158 158 実際にサンプリングを行う際の話に移ります. まずサブメッシュ選択用テーブルを用いてサンプリングを行い,利用するサブメッシュを選択します. 158

160.

Emissive PolygonのNEE → サンプリング構造の運用 シェーディングをするには… サブメッシュを選択 サブメッシュ0 サブメッシュ1 ポリゴンを選択 サブメッシュ2 ・・・ ・・・ サブメッシュ選択用テーブル ポリゴン選択用テーブル 159 159 次に選択されたサブメッシュが持っているポリゴンをサンプリングするためのテーブルを用いて,利用するポリゴンを選択します. 159

161.

Emissive PolygonのNEE → サンプリング構造の運用 シェーディングをするには… サブメッシュを選択 ポリゴンを選択 ポリゴンをサンプリング サンプル サブメッシュ0 サブメッシュ1 サブメッシュ2 1サンプルの生成コスト それなりに効率的 ・・・ ・・・ サブメッシュ選択用テーブル ポリゴン選択用テーブル 実際の運用での問題 サンプル数が膨大 └ 総合的には少し負荷大 160 160 最後に,選択されたポリゴンを一様にサンプリングして,サンプルを生成します. この処理自体は効率的ですが, 実用的なNEEを行うには,多量のサンプルを生成する必要があり,少し負荷がかかります. 160

162.

Emissive PolygonのNEE → サンプリング構造の運用 シェーディングをするには… サブメッシュを選択 サンプル ポリゴンを選択 ポリゴンをサンプリング サンプル サブメッシュ0 サブメッシュ1 サブメッシュ2 事前生成が必要 1サンプルの生成コスト それなりに効率的 ・・・ ・・・ サブメッシュ選択用テーブル ポリゴン選択用テーブル 実際の運用での問題 サンプル数が膨大 └ 総合的には少し負荷大 161 161 そのため,事前にこのサンプルを生成しておきたいです. 161

163.

Emissive PolygonのNEE → サンプリング構造の運用 事前生成からシェーディング… ポリゴンをサンプリング サンプル • テクスチャ未考慮 162 162 まず,今のままでは,テクスチャの考慮ができていません. 162

164.

Emissive PolygonのNEE → サンプリング構造の運用 事前生成からシェーディング… ポリゴンをサンプリング サンプル事前生成 サンプル • テクスチャ未考慮 • テクスチャ込みで サンプルを評価 • 1フレームあたり数千個の サンプルを事前生成 163 163 そこで事前生成のタイミングで,テクスチャの明るさを考慮し,サンプルを1フレームあたり数千個生成します. 163

165.

Emissive PolygonのNEE → サンプリング構造の運用 事前生成からシェーディング… ポリゴンをサンプリング サンプル事前生成 NEEで利用 サンプル • テクスチャ未考慮 • テクスチャ込みで サンプルを評価 • 1シェーディング点あたり 32サンプル利用 • 1フレームあたり数千個の サンプルを事前生成 • Streaming RISで評価 164 164 サンプルを生成したら,これらでStreaming RISを用いてNEEを行います. 164

166.

Emissive PolygonのNEE → サンプリング構造の運用 事前生成からシェーディング… ポリゴンをサンプリング サンプル事前生成 NEEで利用 サンプル Emissive PolygonがNEE対象に • テクスチャ未考慮 • テクスチャ込みで サンプルを評価 • 1シェーディング点あたり 32サンプル利用 • 1フレームあたり数千個の サンプルを事前生成 • Streaming RISで評価 165 165 これで,シーン上の大量のEmissive PolygonもNEEの対象となりました. 165

167.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 166 166 次に間接照明のノイズの改善についてです. 166

168.

間接照明のノイズ改善 → 直接照明と間接照明 直接照明 光源 スクリーン 照射範囲 NEEで効率的に計算 167 167 パストレーシングで明るさを計算するとき,ピクセルから見えている位置が光源の照射範囲に入っている場合直接照明が計算できます. これはNEEを利用することで計算ができます. 167

169.

間接照明のノイズ改善 → 直接照明と間接照明 直接照明 間接照明 光源 スクリーン 光源 スクリーン 照射範囲 NEEで効率的に計算 照射範囲 経路の先で照射範囲に入る必要 168 168 一方で,ピクセルから見えている位置が照射範囲に入っていない場合, 反射を繰り返したその先で,偶然,照射範囲にヒットしなければ光源の影響を受けられません. 168

170.

間接照明のノイズ改善 → 直接照明と間接照明 直接照明 間接照明 光源 光源 間接照明成分はノイズが多い スクリーン スクリーン 照射範囲 NEEで効率的に計算 照射範囲 経路の先で照射範囲に入る必要 169 169 そのため,間接照明の成分はノイズが多くなります. 169

171.

間接照明のノイズ改善 → 直接照明と間接照明 直接照明 間接照明 光源 光源 ReSTIR GI スクリーン スクリーン 照射範囲 NEEで効率的に計算 照射範囲 経路の先で照射範囲に入る必要 170 170 そこで登場するのがReSTIR GIです. 170

172.

間接照明のノイズ改善 → Streaming RISの有用な性質 サンプル生成 勝率計算 選択・格納 • 新規のサンプルと メモリのサンプルでバトル 勝率 重み 3 重み 重み和 1 2+3 3 5 • 勝者がメモリに格納 重み 重み和 1 おさらい 5 重み 重み和 3 5 メモリの状態 171 171 ReSTIR GIのアルゴリズムの説明のために, 一旦ここで,Streaming RISにおける面白い性質について触れておきます. Streaming RISの手順は左に示す通りです. 171

173.

間接照明のノイズ改善 → Streaming RISの有用な性質 サンプル生成 勝率計算 選択・格納 • 新規のサンプルと メモリのサンプルでバトル 勝率 重み 3 おさらい 3 5 • 勝者がメモリに格納 どんな意味が 重み 重み和 1 2+3 重み 重み和 1 5 重み 重み和 3 5 メモリの状態 172 172 このとき,常に重み和を更新し続けてきましたが,これは何を表しているのでしょうか? 172

174.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み • 重み和は戦績 観測してきたサンプル群の 累積的重要度 重み 重み和 3 25 • また各重みは強さ メモリ 観測サンプル履歴 173 173 これはメモリに入っているサンプルの戦績を表します. このとき各サンプルの重みは強さといえるでしょう. 173

175.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み • 重み和は戦績 観測してきたサンプル群の 累積的重要度 重み 重み和 3 25 • また各重みは強さ メモリ 観測サンプル履歴 この重み和を使って面白いことができる 174 174 この戦績を使って面白いことができます. 174

176.

間接照明のノイズ改善 → Streaming RISの有用な性質 メモリに入っているサンプル同士を戦わせることが可能 勝率 20 20 + 4 重み 重み和 1 20 重み 重み和 3 4 重み和 と 重み和 で採用可否決定 175 175 重み和を使うことでメモリに入っているサンプル同士を戦わせることが可能です. 175

177.

間接照明のノイズ改善 → Streaming RISの有用な性質 メモリに入っているサンプル同士を戦わせることが可能 勝率 20 20 + 4 重み 重み和 1 20 重み 重み和 3 4 重み 重み和 1 24 重み和 と 重み和 で採用可否決定 176 176 いま勝者は緑のサンプルだったとしましょう. この勝者には面白い性質があります. 176

178.

間接照明のノイズ改善 → Streaming RISの有用な性質 メモリに入っているサンプル同士を戦わせることが可能 戦績 戦績 重み 重み 観測サンプル履歴 観測サンプル履歴 重み 重み和 重み 重み和 1 20 3 4 重み 重み和 1 24 重み和 と 重み和 で採用可否決定 177 177 勝負をした両者の戦績はこのようになっています. 177

179.

間接照明のノイズ改善 → Streaming RISの有用な性質 メモリに入っているサンプル同士を戦わせることが可能 戦績 重み 戦績 戦績 重み 重み 観測サンプル履歴 観測サンプル履歴 観測サンプル履歴 重み 重み和 重み 重み和 重み 重み和 1 20 3 4 1 24 両者の戦績を引き継ぐ = より多くのサンプルから選抜 178 178 この勝者は,戦績を引き継ぎます. つまり,残ったサンプルはより多くのサンプルから選抜されている状態になります. 178

180.

間接照明のノイズ改善 → Streaming RISの有用な性質 メモリに入っているサンプル同士を戦わせることが可能 戦績 重み 戦績 戦績 重み 重み ReSTIR GIはこれを応用 観測サンプル履歴 観測サンプル履歴 観測サンプル履歴 重み 重み和 重み 重み和 重み 重み和 1 20 3 4 1 24 両者の戦績を引き継ぐ = より多くのサンプルから選抜 179 179 この性質を応用するのがReSTIR GIです. 179

181.

間接照明のノイズ改善 → Streaming RISの有用な性質 ReSTIR GIにおける… 戦績 観測サンプル履歴 (注目ピクセル) 重み 観測サンプル履歴 何を記録? 重み 重み和 2 6 サンプルは? 180 180 ReSTIR GIの目的は間接照明のノイズ改善です. 何をサンプルにすべきかを考えます. 180

182.

間接照明のノイズ改善 → Streaming RISの有用な性質 間接照明を表現するために最低限必要な情報をサンプルにしたい 光源 • 経路全体を保持する必要性? スクリーン 照射範囲 181 181 間接照明を表現するために必要な情報は何でしょう. 経路全体でしょうか? 181

183.

間接照明のノイズ改善 → Streaming RISの有用な性質 間接照明を表現するために最低限必要な情報をサンプルにしたい 光源 • 経路全体を保持する必要性? └ ナシ スクリーン 照射範囲 182 182 経路全体を保持することは間接照明の表現には過剰です. 182

184.

間接照明のノイズ改善 → Streaming RISの有用な性質 間接照明を表現するために最低限必要な情報をサンプルにしたい 光源 この位置からの 寄与に注目 • 経路全体を保持する必要性? └ ナシ • 間接照明とはつまり…? └ 可視点の次のヒット位置からの寄与 スクリーン 照射範囲 183 183 間接照明とはつまり,可視点の次のヒット位置からの寄与ですから,そこだけに注目します. 183

185.

間接照明のノイズ改善 → Streaming RISの有用な性質 間接照明を表現するために最低限必要な情報をサンプルにしたい 位置 出射光 スクリーン 法線 • 経路全体を保持する必要性? └ ナシ • 間接照明とはつまり…? └ 可視点の次のヒット位置からの寄与 • 必要な情報のみに制限 └ 位置 / 法線 / 出射光 短縮したものをサンプルにする 184 184 間接照明の表現に必要な最低限の情報はこういったものでしょう. 184

186.

間接照明のノイズ改善 → Streaming RISの有用な性質 間接照明を表現するために最低限必要な情報をサンプルにしたい 間接照明 サンプル 位置 出射光 スクリーン 法線 • 経路全体を保持する必要性? └ ナシ • 間接照明とはつまり…? └ 可視点の次のヒット位置からの寄与 • 必要な情報のみに制限 └ 位置 / 法線 / 出射光 短縮したものをサンプルにする 185 185 この部分を間接照明サンプルと名付けます. 185

187.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 観測サンプル履歴 (注目ピクセル) 重み 観測サンプル履歴 重み 2 何を記録? 重み和 6 なにをサンプルにするかが確定 186 186 さて,何をサンプルとするかが決まりました. 186

188.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 観測サンプル履歴 (注目ピクセル) 重み 観測サンプル履歴 重み 2 どこから? 重み和 6 このサンプルたちはどこからやってくる? 187 187 ところで,このサンプルたち,どこから得られるでしょうか? 187

189.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 観測サンプル履歴 (注目ピクセル) 重み Frame n (現在) Frame n-1 観測サンプル履歴 重み 2 Frame n-2 どこから? 重み和 6 現在フレームと過去フレーム 188 188 当然現在のフレームと過去のフレームです. 188

190.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 観測サンプル履歴 (注目ピクセル) 重み Frame n (現在) Frame n-1 観測サンプル履歴 重み 2 Frame n-2 隣は? 重み和 6 隣のピクセルはどうなっている? 189 189 隣のピクセルだとどうでしょうか? 189

191.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み 観測サンプル履歴 (隣接ピクセル) Frame n (現在) Frame n-1 観測サンプル履歴 重み 6 Frame n-2 隣は? 重み和 11 隣のピクセルでも同様の状況 190 190 当然,隣のピクセルも似たような状況です. 190

192.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み 観測サンプル履歴 (隣接ピクセル) Frame n (現在) Frame n-1 観測サンプル履歴 重み 6 Frame n-2 vs. 元は? 重み和 11 これを元のピクセルのサンプルと戦わせると? 191 191 であれば,これを元のピクセルにあったサンプルと戦わせるとどうなるのでしょうか? 191

193.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 観測サンプル履歴 (注目ピクセル) 重み Frame n (現在) Frame n-1 観測サンプル履歴 重み Frame n-2 元のピクセル 重み和 2 6 元のピクセルの状態 192 192 例えば戦うことによって,この状態が… 192

194.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み 観測サンプル履歴 (注目ピクセル+隣接ピクセル) Frame n (現在) Frame n-1 観測サンプル履歴 重み 6 Frame n-2 サンプル変更 Frame n (現在) Frame n-2 Frame n-1 重み和 17 時空間的により多様な間接照明サンプルから選択[3] 193 193 このようになり,より多様な間接照明サンプルから選択されたサンプルを得ることができます. 193

195.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み 観測サンプル履歴 (注目ピクセル+隣接ピクセル) Frame n (現在) 時間的 再利用 Frame n-1 観測サンプル履歴 重み 6 Frame n-2 サンプル変更 Frame n (現在) Frame n-2 時間的 再利用 Frame n-1 重み和 17 時空間的により多様な間接照明サンプルから選択[3] 194 194 このとき,同じピクセルにて時間的により良いサンプルを確率的に残す手順を時間的再利用といいます. 194

196.

間接照明のノイズ改善 → Streaming RISの有用な性質 戦績 重み 観測サンプル履歴 (注目ピクセル+隣接ピクセル) Frame n (現在) Frame n-1 観測サンプル履歴 重み 6 Frame n-2 Frame n (現在) 空間的 再利用 サンプル変更 Frame n-2 Frame n-1 重み和 17 時空間的により多様な間接照明サンプルから選択[3] 195 195 異なるピクセル間で空間的により良いサンプルを確率的に残す手順を空間的再利用といいます. このようなアルゴリズムがReSTIR GIです. 195

197.

間接照明のノイズ改善 → ReSTIR GIの有効時・無効時の比較 ReSTIR GI 無効 ReSTIR GI 有効 ノイズ改善 間接照明成分のみ表示 196 196 ここまでで一旦結果を確認してみます. ReSTIR GIを利用することで間接照明成分のノイズを大幅に低減することができています. 196

198.

間接照明のノイズ改善 → 再利用における処理の割り切り • 近傍で経路の寄与が似ていることが前提 └ 寄与の類似性を利用する手法 • ツルツルした材質ではこの前提が崩壊 └ 近傍であっても寄与の相関が低い為 • 改善するには負荷が高い計算が必要[4] 197 197 この手法による再利用は基本的に,近傍で経路の寄与が似ていることが前提です. このときツルツルした材質ではこの前提が崩れます. 改善する方法はありますが,負荷が高いので今回の実装では行っていません. 197

199.

間接照明のノイズ改善 → 再利用における処理の割り切り • ツルツルな部分はReSTIR GIの影響を低減 • パストレーシングの結果をブレンド └ シンプルで軽量 パストレーシング ブレンド ReSTIR GI 時間的再利用 空間的再利用 198 198 そこで,問題のある材質ではReSTIR GIで得た結果の影響を弱めて,通常のパストレーシングの結果とブレンドしてしまいます. すでにある結果と混ぜるだけなので,負荷は特にかかりません. 先ほどの画像はすでにこれを採用した状態の結果です. 198

200.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 199 199 ここまでで,本パストレーサの主要な機能の紹介を行いました. ここからは,ライティング系処理とは異なり,アーティファクト対策や特殊な表現のための手法について少しお話しいたします. まずは,粗いジオメトリにおける影のアーティファクト対策からです. 199

201.

粗いジオメトリにおける影のアーティファクト対策 • 影はポリゴンに対する 光線追跡で計算 • シェーディングは 滑らかな結果 • 影は滑らかではない結果 200 200 パストレーシングではポリゴンに対して光線追跡を行い遮蔽判定をすることで影の計算を実現します. これにより,きれいな影を表現することができます. 一方で,ジオメトリが粗い場合,シェーディングに関しては補間された頂点法線によって滑らかな見た目にできますが, 影に関しては,不連続な見た目になってしまうことがあります. 実際『バイオハザード レクイエム』では,画像のようにレオンの服のシワ部分で不自然な見た目が生じています. 200

202.

粗いジオメトリにおける影のアーティファクト対策 オフセット オフセット • 仮想的に曲面化[5] • レイの位置を補正 補正 無効 補正 有効 • カットシーンのみ利用 201 201 この問題に対処するため,我々は仮想的に曲面化を行ってレイの位置を補正する手法を用いました. これにより,影の不連続感が解消され自然な見た目になります. RE ENGINEにおいては,この計算を行うための情報がGBufferにないので,それを取得するために追加の光線追跡が必要です. そのため,カットシーンのみ,この機能を使うようにしました. 手法の詳細は参考論文をご覧ください. 201

203.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 202 202 次に欠損表現における影の問題の改善についてです. 202

204.

欠損表現における影の処理 • ユーザ定義シェーダで計算されたアルファ値で 欠損を表現 • カメラから見えている位置を計算するためのレイ └ ラスタライザで効率的に計算 欠損 腕 深度 開始 203 203 ゾンビの欠損部が落とす影の描画をパストレーシングで行う場合について考えます. 欠損部の形状自体はユーザ定義シェーダによって計算されたアルファで表現されます. さて,影を表現するので,シェーディング点における遮蔽の計算が必要です. まず,シェーディング点がカメラから見えている位置の場合,既にラスタライザによって計算が行われているので光線追跡は不要です. 203

205.

欠損表現における影の処理 • ユーザ定義シェーダで計算されたアルファ値で 欠損を表現 • カメラから見えている位置を計算するためのレイ └ ラスタライザで効率的に計算 欠損 腕 深度 • それ以降のレイ Any Hit Shaderで表現 └ 三角形に本当にヒットしたかを判定する機能 204 204 問題になるのはそれ以降です. レイがメッシュにヒットするごとに,本当に三角形にヒットしているのかをAny Hit Shaderを使って評価する必要があります. 204

206.

欠損表現における影の処理 • ユーザ定義シェーダで計算されたアルファ値で 欠損を表現 • カメラから見えている位置を計算するためのレイ └ ラスタライザで効率的に計算 欠損 重いAny Hit Shader 腕 重いAny Hit Shader 深度 • それ以降のレイ Any Hit Shaderで表現 └ 三角形に本当にヒットしたかを判定する機能 ヒットする三角形がピクセルによってバラバラ └ 異なるユーザ定義シェーダの呼び出し └ GPUに不向き 205 205 このときヒットする三角形はピクセル単位でバラバラになりやすく,異なるユーザ定義シェーダが呼ばれるようになります. こういったバラバラの処理はGPUには不向きなので,重いユーザ定義シェーダの実行は問題です. 205

207.

欠損表現における影の処理 いままでのRE ENGINEのAny Hit Shaderの機能は… 単純なアルファテストのみサポート • レイトレーシングモードでは間接照明のみ計算 └ 問題が目立たない 206 206 そういうこともあり,RE ENGINEにおけるレイトレーシングでのAny Hit Shaderでは単純なアルファテストのみをサポートしていました. レイトレーシングモードでは,間接照明のみを計算していたので問題が目立ちませんでした. 206

208.

欠損表現における影の処理 いままでのRE ENGINEのAny Hit Shaderの機能は… 単純なアルファテストのみサポート • レイトレーシングモードでは間接照明のみ計算 └ 問題が目立たない • パストレーシングモードでは直接照明も計算 └ 問題が目立つ ゴア表現のため表示を改変 207 207 しかし,パストレーシングモードでは直接照明を計算するので問題が目立ちました. 実際,『バイオハザード レクイエム』のゾンビの欠損部位が落とす影がおかしくなっていました. この問題を改善するために,我々は実用的なアルファテストの仕組みを実装しました. 207

209.

欠損表現における影の処理 いままでのRE ENGINEのAny Hit Shaderの機能は… 単純なアルファテストのみサポート • レイトレーシングモードでは間接照明のみ計算 └ 問題が目立たない Screen Space Alpha Test • パストレーシングモードでは直接照明も計算 └ 問題が目立つ ゴア表現のため表示を改変 208 208 それがScreen Space Alpha Testです. 208

210.

欠損表現における影の処理 → Screen Space Alpha Testの概要 • ラスタライザで計算済みの位置から計算開始 欠損 腕 深度 開始 209 209 ではその概要について話します. もちろん,計算開始位置はラスタライザで計算済みの位置です. 209

211.

欠損表現における影の処理 → Screen Space Alpha Testの概要 • ラスタライザで計算済みの位置から計算開始 • シェーディング位置から光源に向かって レイを射出 欠損 腕 深度 210 210 遮蔽計算をするので,この位置から光源に向かってレイを飛ばします. 210

212.

欠損表現における影の処理 → Screen Space Alpha Testの概要 • ラスタライザで計算済みの位置から計算開始 • シェーディング位置から光源に向かって レイを射出 欠損 腕 • ヒット位置を深度に変換し, 深度バッファの値と比較 深度 211 211 するとレイがメッシュにヒットするので,ヒットした位置を深度に変換し,アルファ考慮済みの深度と比較します. 211

213.

欠損表現における影の処理 → Screen Space Alpha Testの概要 • ラスタライザで計算済みの位置から計算開始 欠損 深度的に カメラ側 深度 • シェーディング位置から光源に向かって レイを射出 腕 • ヒット位置を深度に変換し, 深度バッファの値と比較 • ヒット位置の深度が,深度バッファの深度より カメラ側にあるなら再度光線追跡 212 212 このとき,ヒット位置のほうが深度的にカメラ側にあるなら,再度光源に向かって光線追跡を行います. 212

214.

欠損表現における影の処理 → Screen Space Alpha Testの概要 • ラスタライザで計算済みの位置から計算開始 深度的に カメラ側 • シェーディング位置から光源に向かって レイを射出 欠損 腕 深度 • ヒット位置を深度に変換し, 深度バッファの値と比較 • ヒット位置の深度が,深度バッファの深度より カメラ側にあるなら再度光線追跡 213 213 後は同様の処理を光源に到達するまで反復します. 213

215.

欠損表現における影の処理 → Screen Space Alpha Test有効時・無効時の比較 Screen Space Alpha Test 無効 Screen Space Alpha Test 有効 高負荷なアルファテストを低コストで実現 214 214 これにより,複雑なユーザ定義シェーダを実行していては高負荷だった影の表現を,低コストで再現することができました. 214

216.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 215 215 次にパフォーマンスです. 215

217.

パフォーマンス例 NVIDIA DLSS Performance Mode 1920 × 1080 2560 × 1440 3840 × 2160 RTX 2070 Super 29.95 42.76 99.72 RTX 3060 24.20 38.38 67.93 RTX 4060 Ti 13.64 19.00 34.39 RTX 4070 Ti 8.78 11.70 20.09 RTX 5060 Ti 11.98 16.64 30.78 Units: milliseconds 216 216 こちらが,パフォーマンス結果の一例です. これは開発終盤における『バイオハザード レクイエム』での計測結果です. 216

218.

パストレーシングと利用アルゴリズムの概要 • パストレーシングとは • 多光源環境のための光源カリングとその周辺技術 • Emissive Polygonのサンプリングとその周辺技術 • 間接照明のノイズ改善 特殊な処理 • 粗いジオメトリにおける影のアーティファクト対策 • 欠損表現における影の処理 パフォーマンス例 検証中の機能の一例 展望 217 217 次に,未来のタイトルに向けた検証中の機能を一つ紹介します. 217

219.

検証中の機能の一例:Emissive PolygonのNEE改善 Emissive PolygonにおけるNEEの手順は… • サンプル候補を生成 218 218 さて,Emissive Polygonによる照明計算についておさらいです. NEEの前に,まず候補となるサンプルを生成していました. 218

220.

検証中の機能の一例:Emissive PolygonのNEE改善 Emissive PolygonにおけるNEEの手順は… • サンプル候補を生成 • シェーディング点における 寄与で再サンプリング 219 219 サンプル候補を生成後,それらをシェーディング点における寄与で再サンプリングしていました. 219

221.

検証中の機能の一例:Emissive PolygonのNEE改善 いつでも効率的…? 高効率な場合 影響度の高いサンプルが候補 220 220 このやり方はいつでも効率が良いでしょうか? シェーディング点への影響度が高いサンプルが候補に多く含まれる場合は効率が良いです. 220

222.

検証中の機能の一例:Emissive PolygonのNEE改善 いつでも効率的…? 高効率な場合 低効率な場合 • 候補に重要なものが 少ないケースが存在 • 広大なシーンで問題が顕著 影響度の高いサンプルが候補 影響度の低いサンプルが候補 221 221 しかし,場合によってはシェーディング点から離れた位置にサンプル候補が生成され,NEEの効率が落ちるケースがあります. これは広大なゲームシーンでよく発生します. 221

223.

検証中の機能の一例:Emissive PolygonのNEE改善 いつでも効率的…? 高効率な場合 低効率な場合 • 候補に重要なものが 少ないケースが存在 • 広大なシーンで問題が顕著 影響度の高いサンプルが候補 影響度の低いサンプルが候補 サンプル候補を時空間的に再利用 222 222 そこで,このサンプル候補をStreaming RISの対象にし,時空間的に再利用して良質な候補を利用できるようにします. 222

224.

検証中の機能の一例:Emissive PolygonのNEE改善 サンプルをスクリーンに記録する場合の問題 • サンプル候補を時空間的に再利用 └ 重要なサンプルでNEE スクリーン 参照 可 223 223 このとき,ReSTIR GIのようにスクリーンスペースでピクセルにサンプルを記録したとします. この場合,直接見えている位置では再利用した候補を獲得することができます. 223

225.

検証中の機能の一例:Emissive PolygonのNEE改善 サンプルをスクリーンに記録する場合の問題 • サンプル候補を時空間的に再利用 └ 重要なサンプルでNEE スクリーン 参照 可 • スクリーンに記録すると反射先で利用不可 参照不可 224 224 しかし,この場合,反射先で利用できません. 224

226.

検証中の機能の一例:Emissive PolygonのNEE改善 サンプルをスクリーンに記録する場合の問題 • サンプル候補を時空間的に再利用 └ 重要なサンプルでNEE スクリーン 参照 可 • スクリーンに記録すると反射先で利用不可 • 3Dシーンを分割 └ 分割単位ごとにサンプル候補を保持 └ 任意の位置で利用可能[6] 参照不可 225 225 そこで,3Dシーンを分割しその単位であるセルごとにサンプルを保持することにします. するとあらゆる位置で重要なサンプル候補を利用することができます. 225

227.

検証中の機能の一例:Emissive PolygonのNEE改善 サンプルをスクリーンに記録する場合の問題 • サンプル候補を時空間的に再利用 └ 重要なサンプルでNEE スクリーン ReGIR 参照 可 • スクリーンに記録すると反射先で利用不可 • 3Dシーンを分割 └ 分割単位ごとにサンプル候補を保持 └ 任意の位置で利用可能[6] 参照不可 226 226 このようなアルゴリズムをReGIRといいます. 226

228.

検証中の機能の一例:ReGIR まずはシーンを分割 3D シーン このようなシーンであれば… 227 227 まずは3Dシーンをある単位で分割することから始めます. ここは単純で,グリッドを構築します. このようなシーンであれば… 227

229.

検証中の機能の一例:ReGIR まずはシーンを分割 グリッド (セルの集合) セル このようになる 228 228 このように分割されます. 228

230.

検証中の機能の一例:ReGIR サンプル候補にStreaming RIS 229 229 このグリッドを構成するセルにおいて,サンプル候補を使ってStreaming RISを行います. 229

231.

検証中の機能の一例:ReGIR サンプル候補にStreaming RIS セルに重要サンプル記録 230 230 するとセルに重要なサンプルが記録されます. このサンプルは当然,今のフレームだけでなく過去にもあります. 230

232.

検証中の機能の一例:ReGIR 戦績 重み 観測サンプル履歴 (注目セル) Frame n (現在) Frame n-2 Frame n-1 観測サンプル履歴 重み 4 重み和 10 注目セルにて時間的に再利用 231 231 そこで,ReSTIR GIの場合と同じように注目しているセルにてサンプルを時間的に再利用します. 231

233.

検証中の機能の一例:ReGIR 戦績 観測サンプル履歴 (隣接セル) 重み Frame n (現在) Frame n-2 Frame n-1 観測サンプル履歴 重み 7 重み和 11 隣のセルでも同様に時間的に再利用 232 232 これと同じことは当然,隣のセルでも起きています. 232

234.

検証中の機能の一例:ReGIR 戦績 重み 観測サンプル履歴 (注目セル+隣接セル) Frame n (現在) Frame n-2 Frame n (現在) Frame n-1 Frame n-2 Frame n-1 観測サンプル履歴 重み 7 重み和 21 再利用により多様なサンプルから選抜されたサンプルを獲得 233 233 隣接セル同士のサンプルを戦わせることで,時空間的に再利用されたサンプルを得ることができます. 233

235.

検証中の機能の一例:ReGIR ReGIR 無効 • より重要なサンプル候補が 取得可能 ReGIR 有効 • NEEのノイズが大幅に改善 サンプルの色は格納セルに対応 234 234 これにより,このシェーディング点に対して重要なサンプルのみを候補にしてNEEを実行可能になるので,ノイズが改善します. 234

236.

ReGIR有効時・無効時の比較 検証シーン ReGIR 無効 ReGIR 有効 ノイズが改善 235 235 ReGIRによるノイズの改善例を示します. 左の画像の黄色矩形部分を拡大して比較します. ReGIRを用いることで,明らかにノイズが改善しています. この機能を現在検証しています. 235

237.

今後の展望 表面下散乱 • ReGIRの導入 • ReSTIR DIの導入 └ 可視点でのライティング品質の向上 • VFX対応 • BTDFの採用 └ガラス表現の品質向上 コースティクス • BSSRDFの採用 └表面下散乱の品質向上 • コースティクスの描画 └ Photon Mapping? 236 236 最後に今後の展望についてお話しします. まずは,今お話ししたReGIRの導入です. ReSTIR系の手法としては,今回ReSTIR GIのみを採用しましたが, 直接照明の改善のため,ReSTIR DIの採用も検討しています. 他にも,VFX対応や,ガラス表現のためのBTDF,表面下散乱表現のためのBSSRDFの採用, コースティクスの表現に関しても検討を進めています. 以上で発表を終わります. ご清聴ありがとうございました. 236

238.

参考文献 [1] S. Ogaki, “Vectorized Reservoir Sampling,” in Proc. SIGGRAPH Asia 2021 Technical Communications (SA '21), Tokyo, Japan, Dec. 2021, ACM, pp. 1-4, doi: 10.1145/3478512.3488602. [2] H.-P. Lehmann, L. Hübschle-Schneider, and P. Sanders, “Weighted Random Sampling on GPUs,” arXiv:2106.12270, Jun. 2021. [3] Y. Ouyang, S. Liu, M. Kettunen, M. Pharr, and J. Pantaleoni, “ReSTIR GI: Path Resampling for Real-Time Path Tracing,”Comput. Graph. Forum, vol. 40, no. 8, pp. 17-29, 2021, doi: 10.1111/cgf.14378. [4] D. Lin, M. Kettunen, B. Bitterli, J. Pantaleoni, C. Yuksel, and C. Wyman, “Generalized Resampled Importance Sampling: Foundations of ReSTIR,” ACM Trans. Graph., vol. 41, no. 4, pp. 1-23, 2022. [5] J. Hanika, “Hacking the Shadow Terminator,” in Ray Tracing Gems II, Apress, 2021. [6] J. Boksansky et al., “Rendering Many Lights with Grid-Based Reservoirs,” in Ray Tracing Gems II, Apress, 2021. 237 237 237