---
title: 実用化の時代へ！『バイオハザード レクイエム』『プラグマタ』リアルタイムパストレーシング実践事例 [RE:2026 2026年10月2日登壇]
tags:  #capcom #カプコン #カプコン技研 #re engine #re2026capcom #ゲーム開発 #ゲームエンジン #レイトレーシング #パストレーシング  
author: [カプコン技研](https://www.docswell.com/user/CAPCOM_RandD)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/K74Z6DZ3E1.jpg?width=480
description: 2026年10月にカプコンが開催した「CAPCOM オープンカンファレンス RE:2026」の講演資料です。  ■ 講演映像(再生リスト) https://www.youtube.com/watch?v=egV5DwBsbJo&amp;list=PLD_N6X6tKlCM
published: November 13, 26
canonical: https://www.docswell.com/s/CAPCOM_RandD/5VJ3LQ-RE2026-WEST-6
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/K74Z6DZ3E1.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LJ1RVZRZJG.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJW1L916E2.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EZPM9PRJ3.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/Y76MNKM1EV.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/G75Z5PZLJ4.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/9J2RN6R37R.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/DEYDP9D8EM.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/VJN65L69J8.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/YE9LY4L373.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GE8X6QXLJD.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LEL89X8Q7R.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4JM6ZLXKEW.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PJRP6KN6E9.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/PEX3MLNDJX.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/3EKYGLNDJD.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/L739N3VP75.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/87DGW4837G.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/VJP39M8PE8.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/2EV4M9NVJQ.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/57G1GZK1EL.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EQDXLNNJP.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/KJ4Z6DG371.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/LE1RVZDZEG.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/GEW1L9Y672.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/47ZPM9XRE3.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/YJ6MNK417V.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/GJ5Z5PQLE4.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/9E2RN6P3JR.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/D7YDP9587M.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/VEN65LN9E8.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/Y79LY4R3J3.jpg)

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


# Page. 33

![Page Image](https://bcdn.docswell.com/page/G78X6QWLED.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/L7L89XNQJR.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/4EM6ZLQK7W.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/PERP6K8679.jpg)

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


# Page. 37

![Page Image](https://bcdn.docswell.com/page/P7X3ML8DEX.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/37KYGLKDED.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/LJ39N3ZPJ5.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/8JDGW4R3JG.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/VEP39MWP78.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/27V4M98VEQ.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/5JG1GZ517L.jpg)

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


# Page. 44

![Page Image](https://bcdn.docswell.com/page/47QDXLZNEP.jpg)

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


# Page. 45

![Page Image](https://bcdn.docswell.com/page/KE4Z6D33J1.jpg)

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


# Page. 46

![Page Image](https://bcdn.docswell.com/page/L71RVZ1Z7G.jpg)

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


# Page. 47

![Page Image](https://bcdn.docswell.com/page/G7W1L986J2.jpg)

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


# Page. 48

![Page Image](https://bcdn.docswell.com/page/4JZPM98R73.jpg)

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


# Page. 49

![Page Image](https://bcdn.docswell.com/page/YE6MNKP1JV.jpg)

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


# Page. 50

![Page Image](https://bcdn.docswell.com/page/GE5Z5PKL74.jpg)

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


# Page. 51

![Page Image](https://bcdn.docswell.com/page/972RN6W3ER.jpg)

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


# Page. 52

![Page Image](https://bcdn.docswell.com/page/DJYDP9L8JM.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/V7N65L4978.jpg)

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


# Page. 54

![Page Image](https://bcdn.docswell.com/page/YJ9LY4Q3E3.jpg)

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


# Page. 55

![Page Image](https://bcdn.docswell.com/page/GJ8X6QGL7D.jpg)

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


# Page. 56

![Page Image](https://bcdn.docswell.com/page/LJL89XGQER.jpg)

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


# Page. 57

![Page Image](https://bcdn.docswell.com/page/47M6ZLLKJW.jpg)

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


# Page. 58

![Page Image](https://bcdn.docswell.com/page/P7RP6KK6J9.jpg)

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


# Page. 59

![Page Image](https://bcdn.docswell.com/page/PJX3MLLD7X.jpg)

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


# Page. 60

![Page Image](https://bcdn.docswell.com/page/3JKYGLLD7D.jpg)

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


# Page. 61

![Page Image](https://bcdn.docswell.com/page/LE39N33PE5.jpg)

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


# Page. 62

![Page Image](https://bcdn.docswell.com/page/8EDGW443EG.jpg)

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


# Page. 63

![Page Image](https://bcdn.docswell.com/page/V7P39MMPJ8.jpg)

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


# Page. 64

![Page Image](https://bcdn.docswell.com/page/2JV4M99V7Q.jpg)

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


# Page. 65

![Page Image](https://bcdn.docswell.com/page/5EG1GZZ1JL.jpg)

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


# Page. 66

![Page Image](https://bcdn.docswell.com/page/4JQDXLLN7P.jpg)

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


# Page. 67

![Page Image](https://bcdn.docswell.com/page/K74Z6DD3E1.jpg)

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


# Page. 68

![Page Image](https://bcdn.docswell.com/page/LJ1RVZZZJG.jpg)

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


# Page. 69

![Page Image](https://bcdn.docswell.com/page/GJW1L996E2.jpg)

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


# Page. 70

![Page Image](https://bcdn.docswell.com/page/4EZPM99RJ3.jpg)

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


# Page. 71

![Page Image](https://bcdn.docswell.com/page/Y76MNKK1EV.jpg)

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


# Page. 72

![Page Image](https://bcdn.docswell.com/page/G75Z5PPLJ4.jpg)

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


# Page. 73

![Page Image](https://bcdn.docswell.com/page/9J2RN6637R.jpg)

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


# Page. 74

![Page Image](https://bcdn.docswell.com/page/DEYDP998EM.jpg)

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


# Page. 75

![Page Image](https://bcdn.docswell.com/page/VJN65LL9J8.jpg)

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


# Page. 76

![Page Image](https://bcdn.docswell.com/page/YE9LY44373.jpg)

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


# Page. 77

![Page Image](https://bcdn.docswell.com/page/GE8X6QQLJD.jpg)

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


# Page. 78

![Page Image](https://bcdn.docswell.com/page/LEL89XXQ7R.jpg)

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


# Page. 79

![Page Image](https://bcdn.docswell.com/page/4JM6ZL3KEW.jpg)

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


# Page. 80

![Page Image](https://bcdn.docswell.com/page/PJRP6KQ6E9.jpg)

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


# Page. 81

![Page Image](https://bcdn.docswell.com/page/PEX3ML5DJX.jpg)

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


# Page. 82

![Page Image](https://bcdn.docswell.com/page/3EKYGL6DJD.jpg)

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


# Page. 83

![Page Image](https://bcdn.docswell.com/page/L739N36P75.jpg)

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


# Page. 84

![Page Image](https://bcdn.docswell.com/page/87DGW4V37G.jpg)

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


# Page. 85

![Page Image](https://bcdn.docswell.com/page/VJP39MVPE8.jpg)

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


# Page. 86

![Page Image](https://bcdn.docswell.com/page/2EV4M9ZVJQ.jpg)

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


# Page. 87

![Page Image](https://bcdn.docswell.com/page/57G1GZ41EL.jpg)

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


# Page. 88

![Page Image](https://bcdn.docswell.com/page/4EQDXLGNJP.jpg)

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


# Page. 89

![Page Image](https://bcdn.docswell.com/page/KJ4Z6D5371.jpg)

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


# Page. 90

![Page Image](https://bcdn.docswell.com/page/LE1RVZWZEG.jpg)

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


# Page. 91

![Page Image](https://bcdn.docswell.com/page/GEW1L96672.jpg)

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


# Page. 92

![Page Image](https://bcdn.docswell.com/page/47ZPM9YRE3.jpg)

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


# Page. 93

![Page Image](https://bcdn.docswell.com/page/YJ6MNKD17V.jpg)

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


# Page. 94

![Page Image](https://bcdn.docswell.com/page/GJ5Z5P3LE4.jpg)

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


# Page. 95

![Page Image](https://bcdn.docswell.com/page/LE39N36DE5.jpg)

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


# Page. 96

![Page Image](https://bcdn.docswell.com/page/8EDGW4V2EG.jpg)

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


# Page. 97

![Page Image](https://bcdn.docswell.com/page/V7P39MVLJ8.jpg)

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


# Page. 98

![Page Image](https://bcdn.docswell.com/page/2JV4M9Z67Q.jpg)

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


# Page. 99

![Page Image](https://bcdn.docswell.com/page/5EG1GZ42JL.jpg)

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


# Page. 100

![Page Image](https://bcdn.docswell.com/page/4JQDXLG97P.jpg)

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


# Page. 101

![Page Image](https://bcdn.docswell.com/page/K74Z6D8RE1.jpg)

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


# Page. 102

![Page Image](https://bcdn.docswell.com/page/LJ1RVZ2VJG.jpg)

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


# Page. 103

![Page Image](https://bcdn.docswell.com/page/GJW1L9R3E2.jpg)

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


# Page. 104

![Page Image](https://bcdn.docswell.com/page/4EZPM9RGJ3.jpg)

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


# Page. 105

![Page Image](https://bcdn.docswell.com/page/Y76MNKRQEV.jpg)

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


# Page. 106

![Page Image](https://bcdn.docswell.com/page/G75Z5P82J4.jpg)

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


# Page. 107

![Page Image](https://bcdn.docswell.com/page/9J2RN6K17R.jpg)

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


# Page. 108

![Page Image](https://bcdn.docswell.com/page/DEYDP9N4EM.jpg)

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


# Page. 109

![Page Image](https://bcdn.docswell.com/page/VJN65LX6J8.jpg)

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


# Page. 110

![Page Image](https://bcdn.docswell.com/page/YE9LY48R73.jpg)

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


# Page. 111

![Page Image](https://bcdn.docswell.com/page/GE8X6Q8GJD.jpg)

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


# Page. 112

![Page Image](https://bcdn.docswell.com/page/LEL89XRX7R.jpg)

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


# Page. 113

![Page Image](https://bcdn.docswell.com/page/4JM6ZLR3EW.jpg)

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


# Page. 114

![Page Image](https://bcdn.docswell.com/page/PJRP6KRRE9.jpg)

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


# Page. 115

![Page Image](https://bcdn.docswell.com/page/PEX3MLRYJX.jpg)

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


# Page. 116

![Page Image](https://bcdn.docswell.com/page/3EKYGLR4JD.jpg)

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


# Page. 117

![Page Image](https://bcdn.docswell.com/page/L739N38D75.jpg)

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


# Page. 118

![Page Image](https://bcdn.docswell.com/page/87DGW4M27G.jpg)

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


# Page. 119

![Page Image](https://bcdn.docswell.com/page/VJP39MRLE8.jpg)

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


# Page. 120

![Page Image](https://bcdn.docswell.com/page/2EV4M9R6JQ.jpg)

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


# Page. 121

![Page Image](https://bcdn.docswell.com/page/57G1GZM2EL.jpg)

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


# Page. 122

![Page Image](https://bcdn.docswell.com/page/4EQDXLR9JP.jpg)

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


# Page. 123

![Page Image](https://bcdn.docswell.com/page/KJ4Z6DQR71.jpg)

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


# Page. 124

![Page Image](https://bcdn.docswell.com/page/LE1RVZPVEG.jpg)

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


# Page. 125

![Page Image](https://bcdn.docswell.com/page/GEW1L92372.jpg)

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


# Page. 126

![Page Image](https://bcdn.docswell.com/page/47ZPM9DGE3.jpg)

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


# Page. 127

![Page Image](https://bcdn.docswell.com/page/YJ6MNK1Q7V.jpg)

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


# Page. 128

![Page Image](https://bcdn.docswell.com/page/GJ5Z5P42E4.jpg)

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


# Page. 129

![Page Image](https://bcdn.docswell.com/page/9E2RN6V1JR.jpg)

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


# Page. 130

![Page Image](https://bcdn.docswell.com/page/D7YDP9347M.jpg)

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


# Page. 131

![Page Image](https://bcdn.docswell.com/page/VEN65LV6E8.jpg)

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


# Page. 132

![Page Image](https://bcdn.docswell.com/page/Y79LY46RJ3.jpg)

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


# Page. 133

![Page Image](https://bcdn.docswell.com/page/G78X6QZGED.jpg)

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


# Page. 134

![Page Image](https://bcdn.docswell.com/page/L7L89XDXJR.jpg)

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


# Page. 135

![Page Image](https://bcdn.docswell.com/page/4EM6ZLP37W.jpg)

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


# Page. 136

![Page Image](https://bcdn.docswell.com/page/PERP6K1R79.jpg)

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


# Page. 137

![Page Image](https://bcdn.docswell.com/page/P7X3MLYYEX.jpg)

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


# Page. 138

![Page Image](https://bcdn.docswell.com/page/37KYGL34ED.jpg)

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


# Page. 139

![Page Image](https://bcdn.docswell.com/page/LJ39N3GDJ5.jpg)

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


# Page. 140

![Page Image](https://bcdn.docswell.com/page/8JDGW412JG.jpg)

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


# Page. 141

![Page Image](https://bcdn.docswell.com/page/VEP39MQL78.jpg)

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


# Page. 142

![Page Image](https://bcdn.docswell.com/page/27V4M956EQ.jpg)

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


# Page. 143

![Page Image](https://bcdn.docswell.com/page/5JG1GZ627L.jpg)

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


# Page. 144

![Page Image](https://bcdn.docswell.com/page/47QDXL49EP.jpg)

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


# Page. 145

![Page Image](https://bcdn.docswell.com/page/KE4Z6DLRJ1.jpg)

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


# Page. 146

![Page Image](https://bcdn.docswell.com/page/L71RVZLV7G.jpg)

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


# Page. 147

![Page Image](https://bcdn.docswell.com/page/G7W1L9V3J2.jpg)

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


# Page. 148

![Page Image](https://bcdn.docswell.com/page/4JZPM94G73.jpg)

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


# Page. 149

![Page Image](https://bcdn.docswell.com/page/YE6MNK3QJV.jpg)

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


# Page. 150

![Page Image](https://bcdn.docswell.com/page/GE5Z5PL274.jpg)

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


# Page. 151

![Page Image](https://bcdn.docswell.com/page/972RN6L1ER.jpg)

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


# Page. 152

![Page Image](https://bcdn.docswell.com/page/DJYDP9Q4JM.jpg)

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


# Page. 153

![Page Image](https://bcdn.docswell.com/page/V7N65LK678.jpg)

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


# Page. 154

![Page Image](https://bcdn.docswell.com/page/YJ9LY4VRE3.jpg)

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


# Page. 155

![Page Image](https://bcdn.docswell.com/page/GJ8X6QPG7D.jpg)

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


# Page. 156

![Page Image](https://bcdn.docswell.com/page/LJL89X1XER.jpg)

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


# Page. 157

![Page Image](https://bcdn.docswell.com/page/47M6ZLW3JW.jpg)

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


# Page. 158

![Page Image](https://bcdn.docswell.com/page/P7RP6KYRJ9.jpg)

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


# Page. 159

![Page Image](https://bcdn.docswell.com/page/PJX3MLGY7X.jpg)

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


# Page. 160

![Page Image](https://bcdn.docswell.com/page/3JKYGL447D.jpg)

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


# Page. 161

![Page Image](https://bcdn.docswell.com/page/LE39N3LDE5.jpg)

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


# Page. 162

![Page Image](https://bcdn.docswell.com/page/8EDGW4N2EG.jpg)

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


# Page. 163

![Page Image](https://bcdn.docswell.com/page/V7P39M5LJ8.jpg)

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


# Page. 164

![Page Image](https://bcdn.docswell.com/page/2JV4M9P67Q.jpg)

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


# Page. 165

![Page Image](https://bcdn.docswell.com/page/5EG1GZP2JL.jpg)

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


# Page. 166

![Page Image](https://bcdn.docswell.com/page/4JQDXL297P.jpg)

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


# Page. 167

![Page Image](https://bcdn.docswell.com/page/K74Z6DPRE1.jpg)

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


# Page. 168

![Page Image](https://bcdn.docswell.com/page/LJ1RVZ9VJG.jpg)

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


# Page. 169

![Page Image](https://bcdn.docswell.com/page/GJW1L9Q3E2.jpg)

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


# Page. 170

![Page Image](https://bcdn.docswell.com/page/4EZPM9WGJ3.jpg)

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


# Page. 171

![Page Image](https://bcdn.docswell.com/page/Y76MNKGQEV.jpg)

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


# Page. 172

![Page Image](https://bcdn.docswell.com/page/G75Z5PV2J4.jpg)

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


# Page. 173

![Page Image](https://bcdn.docswell.com/page/9J2RN6317R.jpg)

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


# Page. 174

![Page Image](https://bcdn.docswell.com/page/DEYDP914EM.jpg)

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


# Page. 175

![Page Image](https://bcdn.docswell.com/page/VJN65L26J8.jpg)

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


# Page. 176

![Page Image](https://bcdn.docswell.com/page/YE9LY41R73.jpg)

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


# Page. 177

![Page Image](https://bcdn.docswell.com/page/GE8X6Q4GJD.jpg)

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


# Page. 178

![Page Image](https://bcdn.docswell.com/page/LEL89X6X7R.jpg)

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


# Page. 179

![Page Image](https://bcdn.docswell.com/page/4JM6ZL53EW.jpg)

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


# Page. 180

![Page Image](https://bcdn.docswell.com/page/PJRP6K3RE9.jpg)

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


# Page. 181

![Page Image](https://bcdn.docswell.com/page/PEX3ML4YJX.jpg)

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


# Page. 182

![Page Image](https://bcdn.docswell.com/page/3EKYGLZ4JD.jpg)

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


# Page. 183

![Page Image](https://bcdn.docswell.com/page/L739N3DD75.jpg)

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


# Page. 184

![Page Image](https://bcdn.docswell.com/page/87DGW4P27G.jpg)

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


# Page. 185

![Page Image](https://bcdn.docswell.com/page/VJP39MNLE8.jpg)

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


# Page. 186

![Page Image](https://bcdn.docswell.com/page/2EV4M9K6JQ.jpg)

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


# Page. 187

![Page Image](https://bcdn.docswell.com/page/57G1GZQ2EL.jpg)

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


# Page. 188

![Page Image](https://bcdn.docswell.com/page/4EQDXLK9JP.jpg)

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


# Page. 189

![Page Image](https://bcdn.docswell.com/page/KJ4Z6DKR71.jpg)

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


# Page. 190

![Page Image](https://bcdn.docswell.com/page/LE1RVZXVEG.jpg)

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


# Page. 191

![Page Image](https://bcdn.docswell.com/page/GEW1L9N372.jpg)

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


# Page. 192

![Page Image](https://bcdn.docswell.com/page/47ZPM93GE3.jpg)

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


# Page. 193

![Page Image](https://bcdn.docswell.com/page/YJ6MNKXQ7V.jpg)

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


# Page. 194

![Page Image](https://bcdn.docswell.com/page/GJ5Z5PX2E4.jpg)

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


# Page. 195

![Page Image](https://bcdn.docswell.com/page/LE39N3X1E5.jpg)

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


# Page. 196

![Page Image](https://bcdn.docswell.com/page/8EDGW42KEG.jpg)

間接照明のノイズ改善 → 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


# Page. 197

![Page Image](https://bcdn.docswell.com/page/V7P39M13J8.jpg)

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


# Page. 198

![Page Image](https://bcdn.docswell.com/page/2JV4M9YN7Q.jpg)

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


# Page. 199

![Page Image](https://bcdn.docswell.com/page/5EG1GZ95JL.jpg)

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


# Page. 200

![Page Image](https://bcdn.docswell.com/page/4JQDXLWL7P.jpg)

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


# Page. 201

![Page Image](https://bcdn.docswell.com/page/K74Z6DK5E1.jpg)

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


# Page. 202

![Page Image](https://bcdn.docswell.com/page/LJ1RVZX2JG.jpg)

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


# Page. 203

![Page Image](https://bcdn.docswell.com/page/GJW1L9N2E2.jpg)

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


# Page. 204

![Page Image](https://bcdn.docswell.com/page/4EZPM934J3.jpg)

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


# Page. 205

![Page Image](https://bcdn.docswell.com/page/Y76MNKXGEV.jpg)

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


# Page. 206

![Page Image](https://bcdn.docswell.com/page/G75Z5PXXJ4.jpg)

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


# Page. 207

![Page Image](https://bcdn.docswell.com/page/9J2RN6XQ7R.jpg)

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


# Page. 208

![Page Image](https://bcdn.docswell.com/page/DEYDP98YEM.jpg)

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


# Page. 209

![Page Image](https://bcdn.docswell.com/page/VJN65LQRJ8.jpg)

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


# Page. 210

![Page Image](https://bcdn.docswell.com/page/YE9LY4DZ73.jpg)

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


# Page. 211

![Page Image](https://bcdn.docswell.com/page/GE8X6Q5YJD.jpg)

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


# Page. 212

![Page Image](https://bcdn.docswell.com/page/LEL89XY97R.jpg)

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


# Page. 213

![Page Image](https://bcdn.docswell.com/page/4JM6ZLNVEW.jpg)

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


# Page. 214

![Page Image](https://bcdn.docswell.com/page/PJRP6KDWE9.jpg)

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


# Page. 215

![Page Image](https://bcdn.docswell.com/page/PEX3ML1VJX.jpg)

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


# Page. 216

![Page Image](https://bcdn.docswell.com/page/3EKYGL25JD.jpg)

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


# Page. 217

![Page Image](https://bcdn.docswell.com/page/L739N34175.jpg)

パフォーマンス例
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


# Page. 218

![Page Image](https://bcdn.docswell.com/page/87DGW4QK7G.jpg)

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


# Page. 219

![Page Image](https://bcdn.docswell.com/page/VJP39ML3E8.jpg)

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


# Page. 220

![Page Image](https://bcdn.docswell.com/page/2EV4M9QNJQ.jpg)

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


# Page. 221

![Page Image](https://bcdn.docswell.com/page/57G1GZW5EL.jpg)

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


# Page. 222

![Page Image](https://bcdn.docswell.com/page/4EQDXL3LJP.jpg)

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


# Page. 223

![Page Image](https://bcdn.docswell.com/page/KJ4Z6D1571.jpg)

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


# Page. 224

![Page Image](https://bcdn.docswell.com/page/LE1RVZG2EG.jpg)

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


# Page. 225

![Page Image](https://bcdn.docswell.com/page/GEW1L9K272.jpg)

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


# Page. 226

![Page Image](https://bcdn.docswell.com/page/47ZPM9Z4E3.jpg)

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


# Page. 227

![Page Image](https://bcdn.docswell.com/page/YJ6MNKZG7V.jpg)

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


# Page. 228

![Page Image](https://bcdn.docswell.com/page/GJ5Z5PWXE4.jpg)

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


# Page. 229

![Page Image](https://bcdn.docswell.com/page/9E2RN6QQJR.jpg)

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


# Page. 230

![Page Image](https://bcdn.docswell.com/page/D7YDP9WY7M.jpg)

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


# Page. 231

![Page Image](https://bcdn.docswell.com/page/VEN65L9RE8.jpg)

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


# Page. 232

![Page Image](https://bcdn.docswell.com/page/Y79LY42ZJ3.jpg)

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


# Page. 233

![Page Image](https://bcdn.docswell.com/page/G78X6QMYED.jpg)

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


# Page. 234

![Page Image](https://bcdn.docswell.com/page/L7L89X39JR.jpg)

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


# Page. 235

![Page Image](https://bcdn.docswell.com/page/4EM6ZLDV7W.jpg)

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


# Page. 236

![Page Image](https://bcdn.docswell.com/page/PERP6K4W79.jpg)

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


# Page. 237

![Page Image](https://bcdn.docswell.com/page/P7X3ML2VEX.jpg)

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


# Page. 238

![Page Image](https://bcdn.docswell.com/page/37KYGLM5ED.jpg)

参考文献
[1] S. Ogaki, “Vectorized Reservoir Sampling,” in Proc. SIGGRAPH Asia 2021 Technical Communications
(SA &#039;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


