リアルタイムレイトレーシング時代を生き抜くためのデノイザー開発入門

資料公開
アリ©Silicon Studio Corp., all rights reserved.

シリコンスタジオ株式会社

研究開発室

川口 龍樹

2021.08.24 (CEDEC2021)

0

はじめに

川口

龍樹

Tatsuki KAWAGUCHI

テクノロジー事業本部
研究開発室

セールス＆BC統括部

2017年シリコンスタジオ株式会社に新卒入社
自社リアルタイムレンダリングにおける技術の研究開発に従事
近年はリアルタイムレイトレーシング表現の研究開発に取り組む

資料公開
アリ

©Silicon Studio Corp., all rights reserved.

動画の書き出しで30fps化、ランライムでは20fps程度©Silicon Studio Corp., all rights reserved.

0

はじめに
レイトレーシング対応のGPUの登場（2018年）→ リアルタイムレンダリングの表現はより一層のクオリティアップ
高度なレイトレーシング手法は確率的な特性を持つ→ ノイズが必ず発生する→ デノイザーの出番

本講演の内容自社製のリアルタイムレンダリングエンジンにおける、
リアルタイムレイトレーシングのデノイザー開発についての取り組みを紹介• アルゴリズムの紹介• 各要素技術の実装方法• どのような結果が得られたのか• 細かい問題に対する対処方法©Silicon Studio Corp., all rights reserved.

GeForce RTX™ 2080
Founders Edition
2018年9月20日＊本講演内の画像は縮小や配信における画質の劣化によりノイズの情報が失われている可能性があります

0

はじめに

1

レイトレーシングとノイズ

2

デノイザー概要

3

各種デノイザー紹介

4

アルゴリズム解説と実装

5

デノイザー設計

6

デノイザーの未来とセッションまとめ©Silicon Studio Corp., all rights reserved.

1

レイトレーシングとノイズ©Silicon Studio Corp., all rights reserved.

1

レイトレーシングとノイズ
レイトレーシング（e.g. パストレーシング）
光線（レイ）を追跡（トレース）して3DCGの絵を描画する
レイの衝突したある点からさらに周囲へレイを飛ばして色を決める（半球積分）
レンダリング方程式で表され解くときは確率的なモンテカルロ積分を使う？

レンダリング方程式
𝐼𝐼 𝒙𝒙 = � 𝑓𝑓 𝒙𝒙, 𝝎𝝎𝒊𝒊 𝐿𝐿 𝒙𝒙, 𝝎𝝎𝒊𝒊 |𝒏𝒏 ⋅ 𝝎𝝎𝒊𝒊 |𝑑𝑑𝝎𝝎𝑖𝑖
Ω©Silicon Studio Corp., all rights reserved.

？
確率的に解くモンテカルロ積分𝑁𝑁1
𝑓𝑓 𝑥𝑥𝑖𝑖
𝐼𝐼 𝒙𝒙 ~ �𝑝𝑝 𝑥𝑥𝑖𝑖
𝑁𝑁
𝑖𝑖=0

1

レイトレーシングとノイズ
レイトレーシングの計算（ある点の明るさを求める）
レンダリング方程式
𝐼𝐼 𝒙𝒙 = � 𝑓𝑓 𝒙𝒙, 𝝎𝝎𝒊𝒊 𝐿𝐿 𝒙𝒙, 𝝎𝝎𝒊𝒊 |𝒏𝒏 ⋅ 𝝎𝝎𝒊𝒊 |𝑑𝑑𝝎𝝎𝑖𝑖

モンテカルロ積分
確率的に解くΩ𝑁𝑁1
𝑓𝑓 𝑥𝑥𝑖𝑖
𝐼𝐼 𝒙𝒙 ~ �𝑝𝑝 𝑥𝑥𝑖𝑖
𝑁𝑁
𝑖𝑖=0

飛ばすレイが少ないと同じ本数でも結果にばらつきが出る
光源

サンプル数：多光源

赤い光源にたくさんヒット！

サンプル数：少光
源

サンプル数：少光源にヒットしない

確率的に解くためのサンプル数が少ないと真値との誤差が大きくなる
視覚的なノイズとして現れる！
©Silicon Studio Corp., all rights reserved.

1

レイトレーシングとノイズ

オフラインレンダリング 時間をかけてサンプル数を増やす

時間

リアルタイムレンダリング 1フレームに使える時間が限られているのでサンプル数を増やせない

時間©Silicon Studio Corp., all rights reserved.

デノイザーが必要！

2

デノイザー概要©Silicon Studio Corp., all rights reserved.

2

デノイザー概要

Spatial Accumulation

Temporal Accumulation

Denoiser

足りないサンプル数を補ってノイズを減らす

注目している点の周辺からサンプルを集めて不足を補う≃ 平均値フィルタ©Silicon Studio Corp., all rights reserved.

注目している点の過去のサンプルを集めて不足を補う≃ Temporal super sampling

2
手法

デノイザー概要

2.1. デノイザーの対象
パストレーシング

フォトンマッピング

古典的レイトレーシング

収束に非常に時間がかかるのでデノイザーが必要

一度に収集するフォトンには限りがあるのでデノイザーが必要確率的な処理が無ければデノイズは不要

信号

直接光

間接光

直接光

間接光

シャドウ

鏡面反射

拡散反射

色の情報は基本必要ない
動的な光源に対応するた
めには時間的な処理は抑える必要がある

材質によって性質が大きく変わり視点依存がある
ので柔軟な設計とパラメータ調整が必要

サンプル数が非常に不足するがディティールはあ
まりいらないので大きなフィルタで処理する©Silicon Studio Corp., all rights reserved.

今回はパストレーシングにおける間接鏡面反射光を主に取り上げる2

デノイザー概要

2.2. デノイザーの構成
基本的な流れRay Tracing
Pre- Spatial
Accumulation
TemporalAccumulation
Post- Spatial
Accumulation

Optional : 必要に応じて前処理や利用するデータの管理
Disocclusion

G-Buffer

再帰処理の選び方も様々
SpatialAccumulation

TemporalAccumulation

TemporalAccumulation

SpatialAccumulationnext frame
TemporalAccumulation

SpatialAccumulationnext frame

フィルタした結果を次フレームに持ち越すか否か©Silicon Studio Corp., all rights reserved.

…

Mip Generation

SpatialAccumulationnext frame

TemporalAccumulationnext frame
SpatialAccumulation

3

各種デノイザー紹介©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

既存のリアルタイムデノイザー
アルゴリズム・SVGF
・A-SVGF
・SLGF
・Recurrent Blur

リアルタイムレンダラー
・bgfx
・NVIDIA Falcor
・The-Forge©Silicon Studio Corp., all rights reserved.

ライブラリ・NVIDIA RT Denoiser
・AMD FFX Denoiser

3

各種デノイザー紹介

3.1 SVGF Spatiotemporal Variance-Guided Filteringhttps://research.nvidia.com/publication/2017-07_Spatiotemporal-Variance-Guided-Filtering%3A
Spatiotemporal（時空間）な Variance （分散）をデノイズに利用する
分散はノイズの量を表す指標になるのでフィルタの大きさを調整するのに利用する
過剰ブラーを抑制して高品質な結果を作る©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

3.2 A-SVGF Adaptive SVGF

https://cg.ivd.kit.edu/atf.php
SVGF を光源環境の変化に対応させた手法
輝度の時間勾配をみて大きく変化がある場合は Temporal Accumulation を弱める
時間勾配の正確な追跡に Gradient pixel の実装がレイトレーシング側に必要
Quake II RTX というゲームに採用されている
CEDEC+KYUSHU 2019 で解説したセッションあり http://cedec-kyushu.jp/2019/session/04.html©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

3.3 SLGF Spatiotemporal Luminance-Guided Filter
https://cedec.cesa.or.jp/2019/session/detail/s5ce39bf17ac37
ルミナスエンジンのリアルタイムレイトレーシングデモで開発された手法（CEDEC 2019）
A-SVGF のGradient pixelのような実装や分散パラメータなど複雑な設計を必要としない
レイトレーシングの結果から輝度推定を行いピクセルの取りうる輝度で Temporal Accumulation を調節©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

3.4 Recurrent Blur

https://developer.nvidia.com/gtc/2020/video/s22699-vid
Fast Denoising with Self Stabilizing Recurrent Blurs という GTC 2020 で発表されたアルゴリズム
少ないサンプル数のフィルタを時間的に再帰することで効率的にサンプル数を増やす
適応的なブラー半径や Mipmap を使った階層的な信号復元手法を取り入れて効率的なデノイズを達成
Ray Tracing Gems II にも解説あり©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

3.5 NVIDIA RT Denoisers

https://developer.nvidia.com/nvidia-rt-denoiser
NVIDIA が提供するリアルタイムレイトレーシングをターゲットとしたデノイザーライブラリ
現在は申請するとソースコードへのアクセスを得られる
ReBLUR、SIGMA、ReLAXと用途に応じた三つのデノイザーが提供
いずれも Spatiotemporal なデノイザーですがフィルタの設計やターゲットが異なります
ReBLUR：Recurrent Blur をもとにしたデノイザー
SIGMA：高速な影のデノイザーで物理ベースのフィルタで半影表現を強化する
ReLAX ：レイトレの Direct Illumination 向けに改良された SVGF
©Silicon Studio Corp., all rights reserved.

3

各種デノイザー紹介

3.6 AMD FidelityFX Denoiser

https://gpuopen.com/fidelityfx-denoiser/
AMD が提供するオープンソースのリアルタイムレイトレーシング向けデノイザー
影用の Shadow Denoiser と反射光用の Reflection Denoiser がある
共に Spatiotemporal なデノイザー
Ray Classifier でタイルごとに飛ばすレイを動的に調整する©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1. Spatial Accumulation 詳解

空間的に近傍の情報を利用してサンプル不足を補う＝平均フィルタ
近傍ピクセル間の相関が高ければ機能する

リアルタイムレイトレーシングは極端にサンプルが少ないので大きなフィルタサイズが必要→高速で効率的な広範囲のフィルタリング処理が求められる空間的＝「2次元スクリーンスペース＋3次元空間のジオメトリ情報」の処理であることが多い©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.1. À-Trous Filter

再帰的な処理で広範囲をフィルタリングする手法
1パス目（影響範囲3x3）

2パス目（影響範囲7x7）

3パス目（影響範囲15x15）1

信号解析の分野で高速な Wavelet 変換の手法として提案

A Real-Time Algorithm for Signal Analysis with the Help of the Wavelet Transform [Holschneider et al. 1989]

リアルタイムレイトレーシングのデノイズフィルタに応用

Edge-avoiding À-Trous wavelet transform for fast global illumination filtering [Dammertz et al. 2010]©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.1. À-Trous Filter
float4 ATrous(...){
int N = 8;
int2 offsets[] = {int2(-1, 0), int2( 0, -1), int2( 1,
int2(-1, -1), int2( 1, -1), int2(-1,};}0), int2( 0,1), int2( 1,1),
1)

float weight = 1.0;
float4 color = LoadColor(texidx);
for(int i=0; i<N; ++i){
float2 offset = offsets[i] * (1 << recursionCount);
float w = ComputeWeight(...);
color += w * LoadColor(texidx + offset);
weight += w;} // End for
return color / (weight);

1パス目：recursionCount=0 → オフセット 1 pixel
2パス目：recursionCount=1 → オフセット 2 pixel
3パス目：recursionCount=2 → オフセット 4 pixel©Silicon Studio Corp., all rights reserved.

Filter なし©Silicon Studio Corp., all rights reserved.

Filter 3x3(9 fetch / pixel)

0.52 ms ＊ 検証のため動的なループを使用©Silicon Studio Corp., all rights reserved.

A-Trous x1(9 fetch / pixel)

0.42 ms

Filter 7x7(49 fetch / pixel)

1.65 ms ＊ 検証のため動的なループを使用©Silicon Studio Corp., all rights reserved.

A-Trous x2(18 fetch / pixel)

0.86 ms

Filter 15x15(225 fetch / pixel)

7.20 ms ＊ 検証のため動的なループを使用©Silicon Studio Corp., all rights reserved.

A-Trous x3(27 fetch / pixel)

1.16 ms

4

アルゴリズム解説と実装

4.1.2. Poisson Disk Blur

疎な効率のいいサンプリングパターンを利用する方法

Poisson Disk (8 samples)

サンプル点を回転して効率化

Recurrent Blur では
Blur結果を再帰する

半径のパラメータで影響範囲の調整が容易
サンプルパターンをランダマイズ（回転）することで時間的に効率のいいサンプル収集が可能
単一でのサンプル数が足りないケースでは時間的な再帰に含める©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.2. Poisson Disk Blur

デノイズに合わせたディスクの改良も提案されている

Fast Denoising with Self Stabilizing Recurrent Blurs [Zhadan 2020] (GTC2020)

ディスクをワールド空間上のジオメトリに合わせて配置
スクリーンに投影したディスクでフィルタリング©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.3. Mipmap & Down Sampling

解像度を落とす＝フィルタリング
Mip 0

Mip 1

½

½

Mip 2

解像度半分（Mip 1 Level）ごとに2の累乗でサンプル数を補える（Mip0:1x1, Mip1:2x2, Mip2:4x4, …, Mip4:16x16）
アップスケーリング処理が必要（Bilateral Upsampling）©Silicon Studio Corp., all rights reserved.

½

Mip 3

4

アルゴリズム解説と実装

4.1.4. Edge Stopping Function

スクリーンスペースの Spatial Accumulation は近傍ピクセルが3次元空間的にも近傍でなければならない
法線

反射形状

深度

ID

ジオメトリ情報

Edge Stopping Function はエッジ保存フィルタにおける重み付け関数
3次元空間的に離れている・異なる物体（＝エッジ）を跨いだフィルタリングを抑制する©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.4. Edge Stopping Function
法線
深度
空間位置
輝度
反射形状

©Silicon Studio Corp., all rights reserved.

𝑤𝑤𝑛𝑛 = max 0.0, 𝐧𝐧 𝐩𝐩 ⋅ 𝐧𝐧 𝐪𝐪

𝜎𝜎𝑛𝑛𝑤𝑤𝑧𝑧 = exp −𝑧𝑧 𝐩𝐩 − 𝑧𝑧 𝐪𝐪
𝜎𝜎𝑧𝑧 + 𝜀𝜀

𝑤𝑤𝑠𝑠 = exp −𝐩𝐩 − 𝐪𝐪 ⋅ 𝐩𝐩 − 𝐪𝐪
𝜎𝜎𝑠𝑠 + 𝜀𝜀

𝑤𝑤𝑙𝑙 = exp −𝑤𝑤𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠 =𝑙𝑙 𝐩𝐩 − 𝑙𝑙 𝐪𝐪

𝜎𝜎𝑙𝑙 ℊ3×3 𝑉𝑉 𝑙𝑙 𝐩𝐩

2 𝜆𝜆�𝑖𝑖 𝜆𝜆�𝑗𝑗
𝜆𝜆�𝑖𝑖 + 𝜆𝜆�𝑗𝑗

𝛽𝛽

単に法線の差の絶対値を使うこともある

深度勾配で正規化する手法も提案されているスクリーン位置だとガウシアンになる
3次元位置だと深度項の代替としても機能する+ 𝜀𝜀

𝛽𝛽 𝜆𝜆�𝑖𝑖 𝜆𝜆�𝑗𝑗
𝐺𝐺 𝝃𝝃𝑖𝑖 , 𝝃𝝃𝑗𝑗 ,𝜆𝜆�𝑖𝑖 + 𝜆𝜆�𝑗𝑗

分母の𝑉𝑉 𝑙𝑙 𝐩𝐩 が輝度分散を表す
分散によってフィルタサイズを調整できる

Spatiotemporal Variance-Guided Filtering [Schied 2017]

反射形状の球面ガウス関数表現で定義される

Specular Lobe-Aware Filtering and Upsampling forInteractive Indirect Illumination [Tokuyoshi 2016]4アルゴリズム解説と実装

4.1.4. Edge Stopping Function
for(...){
float w = 0.0;
w += -abs(Depth(p) - Depth(q))/(float)(sigma_z + 0.001); //深度
w += -abs(dot((p - q), (p - q))/(float)(sigma_p + 0.001); //3D位置
w += -(float)(ID(p) != ID(q)) * sigma_id; //ID
float weight = exp(w);weight*= pow(max(0.0, dot(Normal(p), Normal(q))), sigma_n); // 法線
color
totalWeight+= (weight * Color(q));+= weight;}
color /= totalWight;©Silicon Studio Corp., all rights reserved.

フィルタなし©Silicon Studio Corp., all rights reserved.

Edge Stopping Function なし©Silicon Studio Corp., all rights reserved.

深度©Silicon Studio Corp., all rights reserved.

法線©Silicon Studio Corp., all rights reserved.

3D 座標©Silicon Studio Corp., all rights reserved.

Specular Lobe

©Silicon Studio Corp., all rights reserved.

Edge Stopping Function あり

・3D座標 (≃深度)
・Specular Lobe (≃法線)
・ID・輝度©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.5. 分散の利用

分散（Variance）はノイズの量を表す指標になる
分散(小)→ノイズ(少)→フィルタ半径(狭)分散(大)→ノイズ(多)→フィルタ半径(広)𝑉𝑉 𝑋𝑋 = 𝐸𝐸 𝑋𝑋 − 𝐸𝐸 𝑋𝑋

求めたい分散の値

2= 𝐸𝐸 𝑋𝑋 2 − 𝐸𝐸 𝑋𝑋 2

輝度の平均値
Spatial / Temporal Accumulation の結果がそのまま平均値として使える
輝度の二乗の平均値（二次モーメント）
輝度の二乗値を描き出しておいて同じように Accumulation する
Spatiotemporal Variance-Guided Filtering: Real-Time Reconstruction for Path-Traced Global Illumination [Schied et al. 2017]©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.5. 分散の利用
Spatial Accumulation → Spatial Variance ≃空間的なノイズの量
画像のエッジなどでも分散は高くなるのでノイズだけを表す指標ではない
Temporal Accumulation → Temporal Variance ≃時間的なノイズの量（光源環境が変わらないなど）安定した環境下ならノイズの指標になる
基本的に Temporal Variance を使う
Disocclusion（後述）発生直後は Spatial Variance を使う©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.1.5. 分散の利用
Edge Stopping Function の輝度項で分散を使う
輝度

𝑤𝑤𝑙𝑙 = exp −𝑙𝑙 𝐩𝐩 − 𝑙𝑙 𝐪𝐪

𝜎𝜎𝑙𝑙 ℊ3×3 𝑉𝑉 𝑙𝑙 𝐩𝐩+ 𝜀𝜀

分母の𝑉𝑉 𝑙𝑙 𝐩𝐩 が輝度分散を表す
分散によってフィルタサイズを調整できる

分散の低い箇所でフィルタを抑制するように働く（絵としては効果がわかりにくい）
再帰回数やフィルタサイズに作用させる方法も考えられる

Temporal Accumulation をリセットした直後の分散©Silicon Studio Corp., all rights reserved.

𝑙𝑙 𝐩𝐩 ：ピクセル𝐩𝐩の輝度値
𝑉𝑉 𝑙𝑙 𝐩𝐩 ：輝度分散ℊ3×3 ⋅ ：ガウシアンカーネル

4

アルゴリズム解説と実装

4.2. Temporal Accumulation 詳解

同一点の過去の結果を利用してサンプル数を補う
Temporal Anti-Aliasing と実質同じだが必要な過去の情報が多い＊同一点≠スクリーン上の同じ座標動くものやカメラに応じて3次元空間内の同一点を追跡する→ Reprojection, Backprojection
過去フレームではスクリーンに映っていなかった箇所も存在する（Reprojection が失敗する）→ Disocclusion©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.1. 指数移動平均フィルタ（EMAF）

ヒストリバッファに過去のすべてのサンプルの累積が記録される
指数移動平均（lerp）：𝑋𝑋𝑡𝑡 = 𝑥𝑥𝑡𝑡 ⋅ 𝛼𝛼 + 𝑋𝑋𝑡𝑡−1 ⋅ 1 − 𝛼𝛼𝑥𝑥𝑡𝑡

現在フレームの結果
1spp 程度で非常にノイジー

𝑋𝑋𝑡𝑡−1

過去フレームの結果
サンプルが累積してきれいになっている

𝛼𝛼 大：現在のサンプルが支配的、補えるサンプル数が少なくノイズの多い結果
𝛼𝛼 小：過去のサンプルが支配的、動的なシーンの変化が残像となって表れやすい

ピクセル毎の Reprojection の成功回数（History Length）を記録しておき 𝛼𝛼 の決定に利用する
連続して成功する（安定している） → 過去フレームを信頼して利用できる→ 𝛼𝛼 を小さくとれる
1
History Length は最大24～30フレーム程度
𝛼𝛼 =History Length©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.2. Reprojection

Motion Reprojection：Motion Vector で同一点を追跡する
float2 MotionReprojection2D(...) // Motion Vector がスクリーン上の2Dのケース{
float2 UV_prev = UV_curr + motionVector.xy;
return UV_prev;}
float2 MotionReprojection3D(…) // Motion Vector が View-space の3Dのケース{
float3 vPos
= CalcViewSpacePos(…);
float3 vPosPrev= vPos + motionVector.xyz;
float4 ClipPosPrev = mul(float4(vPosPrev, 1.0), previousProjectionMatrix);
float2 UV_prev= ClipPosprev.xy / ClipPosprev.w * float2(0.5, -0.5) + 0.5;
return UV_prev;}

top view

Motion Vector

float2 UV_prev = MotionReprojection2D(...);
float4 CurrentColor = LoadColor(UV_curr);
float4 PreviousColor = LoadColor(UV_prev);
float4 AccumlatedColor = lerp(PreviousColor, CurrentColor, alpha);

動く物体の Motion Vector を使って前フレームの画面でどこに映っていたかを追跡する再投影したスクリーン座標でヒストリバッファからサンプルを得て EMAF でブレンドする
スムースな面の鏡面反射は視線依存の特性が強く Motion Vector が役立たない©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.2. Reprojection

Reprojection なし

Reprojection あり

ハイライトがオブジェクトの動きについてこない

ハイライトがオブジェクトの動きに追従する©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.2. Reprojection

Hit Point Reprojection：鏡面反射の仮想的なヒット点を追跡する
front view
Current
ScreenPrevious
ScreenCurrent
CameraReflected Point

float2 HitPointReprojection(...){
float3 vPos = CalcViewSpacePos(...);
float primary_ray_length = length(vPos);
vPos = normalize(vPos); // view vector

Previous
Camerafloat ray_length = primary_ray_length + reflected_ray_length;
vPos *= ray_length; // extend ray to virtual reflected point

Virtual Point
再投影点

Previous Screen

注目点side view

float3 wPos = mul(float4(vPos, 1.0), inverseViewMatrix).xyz;
float4 ClipPosPrev = mul(float4(wPos, 1.0), previousViewProjectionMatrix);
float2 UV_prev = ClipPosPrev.xy / ClipPosPrev.w * float2(0.5, -0.5) + 0.5;
return UV_prev;

Current Screen

}

再投影点

float2 UV_prev_motion = MotionReprojection2D(...);
float2 UV_prev_hitpt = HitPointReprojection(...);
float2 UV_prev = lerp(UV_prev_motion, UV_prev_hitpt, roughness > threshold);

注目点
Hit Point Reprojection

Camera Motion

仮想的な反射空間における点を過去のカメラのスクリーンに投影する
反射レイの長さを記録しておく必要がある（鏡面反射バッファのαに格納しておく）
ラフネスで Motion Reprojection と Hit Point Reprojection を選択する©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.2. Reprojection

Motion Reprojection

Hit Point Reprojection

外の映り込みが床に追従してしまう

残像はあるが反射の位置はあっている©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.3. Clip / Clamp

Reprojection の精度には限界があり残像の発生は避けられない
注目ピクセルの周辺カラーの min/max で過去カラーの値を制限
maxColor

CurrentColor

HistoryColor

ClampedColor
ClippedColor

minColor

Clamp：min/max で色を Hisoty の値を制限
Clip：min/max で作った AABB とCurrent-History 線分の交差位置の色を取る

float4 mean = filteredColor; // 1次モーメントのフィルタカラー
float4 mean2 = filteredColor2; // 2次モーメント（輝度の二乗値）のフィルタカラー
float4 variance = mean2 - mean * mean;
float4 radius = StdDevScalar * sqrt(variance); // 標準偏差の半径スケール
float4 minColor = mean - radius;
float4 maxColor = mean + radius;// Clip (AABB-Ray Intersection)
float3 dir = currentColor - historyColor;float3 p0 = (minColor - historyColor) / dir;float3 p1 = (maxColor - historyColor) / dir;float t = max(max(min(p0.x, p1.x), min(p0.y, p1.y)), min(p0.z, p1.z));
historyColor = lerp(historyColor, currentColor, t);// Clamp
historyColor = clamp(historyColor, minColor, maxColor);

Temporal AA でも使われる残像の低減手法 High Quality Temporal Supersampling [Karis 2014]
分散から min/max を求める Variance Clipping は Pre- Spatial Accumulation で効率的に求まる
An Excursion in Temporal Supersampling [Salvi 2016]©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.3. Clip / Clamp

Hit Point Reprojection のみ

Hit Point Reprojection + Variance Clipping

Hit Point Reprojection と Variance Clipping を組み合わせて残像感の無い綺麗な Accumulation が達成された©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.4. Disocclusion –概要

オブジェクトの移動などで画面に現れる Reprojection が失敗する点
Previous Frame

Current Frame

前フレームでは手前のBoxに隠れていた！

この点を Reprojection したい

奥のBoxは動かないので画面上の同じ場所に Reproject される

Disocclusion 検出の専用パスで領域をマスクとして書き出しておくと利用しやすい・同時に History Length も記録できる・後処理でDisocclusion領域のノイズ（ジッタリングなど）を除去できる・後処理で軽いブラーを適用して境界をなじませることができる©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.4. Disocclusion –検出

Disocclusion 検出には過去フレームのジオメトリ情報を利用する

bool bSuccess = all( UVprev == SATURATE(UVprev)); // in screen
bSuccess = bSuccess && (abs(historyDepth - centerDepth) < depthThreshold);bSuccess = bSuccess && (-dot(historyNormal, centerNormal) * 0.5 + 0.5) < normalThreshold;bSuccess = bSuccess && (centerID == historyID);float historyLength = rcp(DisocclusionOutput[pixelIDX].y);historyLength = bSuccess ? min(historyLength + 1, MAX_FRAMES_COUNT) : 1.0;
DisocclusionOutput[pixelIDX]= float2(!bSuccess, rcp(historyLength));Reprojection 前後が異なるオブジェクトであったら Disocclusion が発生したと考える
異なるオブジェクトかどうか現在と過去のジオメトリ情報を比較して判定する・オブジェクトID、法線方向、深度、etc...
過去フレーム GBuffer や深度バッファを保持しておく必要がある©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.4. Disocclusion –補完

Disocclusion 領域はTemporal Accumulation が使えない

History Length が短い（緑）現在フレームの割合が多め

Disocclusion Mask（黄色）現在フレームの結果だけで補完する

強い Spatial Accumulation で補完する必要がある（Disocclusion Fix）
・Temporal Accumulation 前に Pre- Spatial Accumulation を行う
・Temporal Accumulation 後に Disocclusion 領域を強くフィルタする
今回は Pre- Spatial Accumulation を採用しているので前者©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.4. Disocclusion –補完
Current Color

Previous Color

Filtered Color

with Reprojection

𝑋𝑋𝑡𝑡 = 𝑥𝑥𝑡𝑡 ⋅ 𝛼𝛼 + 𝑋𝑋𝑡𝑡−1 ⋅ 1 − 𝛼𝛼

緑← (短) History Length (長) →黒大 ←α→ 小𝑋𝑋𝑡𝑡′ = 𝑋𝑋𝑡𝑡 ⋅ 1 − 𝛽𝛽 + ℊ 𝑥𝑥𝑡𝑡 ⋅ 𝛽𝛽

黄：Disocclusion Mask→β=1©Silicon Studio Corp., all rights reserved.

Final Color

4

アルゴリズム解説と実装

4.2.4. Disocclusion

Disocclusion 補間無し

©Silicon Studio Corp., all rights reserved.

Disocclusion 補間あり

4

アルゴリズム解説と実装

4.2.5. 動的な光源

Reprojection は光源環境の変化を追跡できない
・現在フレームの推定輝度を求めて Temporal Accumulation の結果を補正する（SLGF）
現在フレームの推定輝度として Pre- Spatial Accumulation が利用できる
・現在と過去フレームの輝度変化率を求め変化が大きいときは現在フレームの結果を多く使う
前フレームの位置を完全に追跡するために乱数シードの再利用などが必要（A-SVGF）
採用手法（さらなる改善が必要）
輝度を見て輝度差が大きいときは現在フレームのフィルタ値を多く混ぜる
A-SVGF のような Reprojection の信頼性は保証しない
輝度差の計算にはPre- Spatial Accumulation の結果を使う
閾値の調整が難しく残像やちらつきが生じやすい
float3 accumulatedColor = lerp(historyColor, currentColor, alpha);
float luminanceDiff = abs(Luma(filteredColor) - Luma(accumulatedColor)); // 輝度差の計算はフィルタした値を使う
float luminanceCheck = (float)(luminanceDiff > luminanceThreshold);
resultColor = lerp(accumulatedColor, filteredColor, luminanceCheck);©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.2.5. 動的な光源

輝度閾値処理無し
一度影の明るく（暗く）なると戻りにくい©Silicon Studio Corp., all rights reserved.

輝度閾値処理あり
しっかりと残像なく影の移動が見て取れる

閾値設定が甘いと汚い残像が残る→

4

アルゴリズム解説と実装

4.3.1. 実装の考察点
TA

?

SA

Temporal Accumulation で Spatial Accumulation の結果を再帰すべきかどうかは重要な問題
強いフィルタ結果を再帰するとぼやけた結果は残り続けて NG
サンプル数が少ないフィルタを再帰するのは許容範囲（再帰が進んだら半径を小さくする）
Specular Lobe Aware Filter はかなり有効だがサンプル数が少ないとノイズが残りやすい
Temporal Accumulation が進むまでは効果を抑える方がよい

V+

Denoiser
Stabilizer

輝度分散は黒い領域に反応できないが、分散に意図的な値を加える分散ブーストも有効
ただし分散を使った処理そのものがモーメント保持や品質、調整しやすさからオミットも視野
一度の Temporal Accumulation では時間的なジラジラが残りやすい
追加で軽い Temporal Accumulation を行って時間的な安定性を上げる Temporal Stabilization
Temporal Anti-Aliasing がエンジンに搭載されていればそのまま利用すればよい©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.3.2. 特殊な信号の扱い

完全鏡面の扱い
実質的にフルのパストレーシングを扱うことになる
完全鏡面は間接鏡面反射光
・ただし拡散反射成分もそのまま含まれる・さらに GBuffer にジオメトリ情報が存在しない
信号の分離
完全鏡面上の拡散反射成分は拡散反射の信号に含める
鏡に色がついていると扱いが複雑
今回は非採用（完全鏡面上の拡散反射光も鏡面反射光のデノイザーで扱う）
セカンダリ GBuffer
レイトレーシング時に完全鏡面上のジオメトリ情報を描きだす©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.3.2. 特殊な信号の扱い

拡散反射・半透明
鏡面反射以外の信号は異なるテクニックが求められる
間接拡散反射光
サンプル数が大きく不足する→フィルタ半径を非常に大きくとる、解像度を落とす
BRDF 適用前の入射輝度と入射方向 を SH で管理する
デノイズの過程で一次サーフェスの情報が失われない
レイトレ輝度(RGB)→ (YCoCg) → [Y, 方向] の SH (L1 まで 4成分)＋CoCg
結果をシーンに合成する際に法線で SH を展開し BRDF を適用
Precomputed Global Illumination in Frostbite (GDC 2018)

半透明（Future works）
信号の性質自体は鏡面反射に近く、鏡面反射に含めて扱うケースも多い
ただし屈折を伴う半透明は Reprojection が非常に難しい
その他（Future works）：クリアコート、SSS など特殊材質©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.3.3. その他のテクニック

Firefly Rejection
確率的なパストレーシングでは高輝度の点が生じることがある
ただ Spatial Accumulation すると輝点が広がってしまう・Clamp
輝度値の範囲がある程度わかっているなら有効
ただしTemporal Accumulation でエネルギー損失が累積する分散を使って外れ値を補正する方法もあるがエネルギー損失は同様に起こる
・Path Regularization
BRDF そのものをブラーして高輝度を避けるという考え方
レイが反射するたびにラフネスを増やすことで得られる
・Median Filter, Min/Max Filter (Opening)
ゴマ塩ノイズ除去に適した画像処理フィルタを Spatial Accumulation の前処理に入れる
ただしエネルギーが狂うので Temporal Accumulation に再帰させるのはNG©Silicon Studio Corp., all rights reserved.

4

アルゴリズム解説と実装

4.3.3. その他のテクニック

Blue Noise
パストレーシングのノイズ自体に良好な特性を持たせることも重要

パストレーシング結果のノイズ分布が画面上で Blue Noise 特性を持つとデノイズしやすい
Blue Noise：低周波成分が少ないノイズ → 狭いフィルタ半径でノイズを消せる

Distributing Monte Carlo Errors as a Blue Noise in Screen Space by Permuting Pixel Seeds Between
Frames [Heitz and Belcour 2019]©Silicon Studio Corp., all rights reserved.

White Noise
5x5 box filter©Silicon Studio Corp., all rights reserved.

Blue Noise
5x5 box filter©Silicon Studio Corp., all rights reserved.

5

デノイザー設計©Silicon Studio Corp., all rights reserved.

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

ジオメトリ情報を GBuffer に描き出す・深度・法線
・モーションベクトル
・ラフネス

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

各信号ごとにレイトレーシング・影・間接鏡面反射・間接拡散反射・半透明・完全鏡面上の二次ジオメトリ情報
分散を利用するため輝度の二乗も描き出す（鏡面反射成分のみ）

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

デノイズに利用する情報を Metadata として整理しておく
必要に応じて一次ジオメトリ（GBuffer）と完全鏡面上の二次ジオメトリ（RayTracing）の情報を統合する・深度（View Z も可）・法線
・モーションベクトル
・ラフネス
・ID（レイトレのインスタンスID）

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

Disocclusion を検出してマスクとして描き出す
同時にReprojection の成功回数も描き出す（History Length）
必要に応じて平均値フィルタをかける（領域の広がる方向にのみ）

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

事前 Spatial Accumulation を行う
Temporal Accumulation の処理に利用する
・Disocclusion補完・Variance Clipping
必要に応じてフィルタ結果の Mipmap を生成より強いフィルタ結果として利用する
MaxMipLevel*roughness で選ぶとよい

5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

Temporal Accumulationを行う
・Reprojection
・EMAF
・Disocclusion 補完
・Variance Clipping
Temporal Accumulation の結果で History Buffer
を更新する（Post- Spatial Accumulation は再帰させない）
Metadata の History も更新しておく5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
GBuffer
RayTracing
Metadata
Disocclusion
Pre- Spatial Accumulation
Temporal Accumulation
Post- Spatial
Accumulation©Silicon Studio Corp., all rights reserved.

事後Spatial Accumulationを行う
必要に応じて鏡面反射は1パス目で Median
Filter をかけて Firefly Rejection を行う
必要に応じてより強いフィルタのため Mipmap
を生成する
Mipmap をシーン解像度に合わせるためのUpsampling も行う
得られた最終的な絵はライティング時に間接光として合成する5

デノイザー設計とパフォーマンス

5.1. デノイザーの処理フロー
Denoiser・・・Lighting
・・・

TAA
・・・
©Silicon Studio Corp., all rights reserved.

ラスタライザでライティング処理
間接反射光としてデノイズ結果を足し合わせる
Temporal Stabilization
通常の Temporal Anti-aliasing でデノイズ結果の時間的な安定性が向上する

5

デノイザー設計とパフォーマンス

5.2. パフォーマンス

Metadata

0.26 ms
0.53 ms
1.31 ms

検出0.56 ms

A-Trous x1

Disocclusion
Mip Gen x2

A-Trous x3

0.07 ms x2

TemporalAccumulation

0.35 ms
1.00 ms

A-Trous x2 + Median＊1920x1080 NVIDIA TITAN RTX で測定©Silicon Studio Corp., all rights reserved.

Pre- Spatial
Accumulation

Mip Gen0.07 ms

計 4.43 ms

Upsampling

0.20 ms

Post- Spatial
Accumulation

5

デノイザー設計とパフォーマンス

5.2. パフォーマンス
0.26 ms
検出0.53 ms

Metadata
A-Trous x1

0.56 ms

A-Trous x3

Disocclusion
Mip Gen x2

0.07 ms x2

1.31 ms

TemporalAccumulation

0.35 ms
A-Trous x2+Median

1.00 ms

Mip Gen Upsampling

0.07 ms

0.20 ms＊1920x1080 NVIDIA TITAN RTX で測定©Silicon Studio Corp., all rights reserved.

Pre- Spatial
Accumulation

Post- Spatial
Accumulation

計 4.43 ms

・Spatial Accumulation の改善は必須
今回は検証用コードも含まれる
小さいフィルタを再帰に含める Recurrent Blurの手法も有効か・Disocclusion は TA 内で扱ってもよい・Pre- SA は分散や Disocclusion の処理など有用な場面も多いが処理時間に見合わない
・Spatial Accumulation は影響範囲が重要
・Mip4 とA-Trous 3回が同じ影響範囲なので、同時に使ってもサンプル数収集には非効率・実情としては Ray Tracing の負荷が支配的で数十 ms はかかってしまっている6

デノイザーの未来とセッションまとめ©Silicon Studio Corp., all rights reserved.

5

デノイザーの未来とセッションまとめ

6.1. デノイザーの未来
画像処理・ライブラリ化されているものも含めて今の主流
・カスタマイズ性が高いのでさらに多様な手法が提案されていくと考えられる・ 特に SVGF ベースの手法が多く発展しているが Recurrent Blur にも注目

機械学習・オフライン向けはたくさん提案されている・リアルタイム向けも確実に実用化に向かっていると思われる

Adversarial Monte Carlo Denoising with Conditioned Auxiliary Feature Modulation [Xu et al. 2019]

最新手法

・Spatiotemporal にパストレーシングのサンプルを重みづけてノイズを低減
・必ずしも画像処理的手法に頼る必要が無いことが示されている©Silicon Studio Corp., all rights reserved.

Spatiotemporal reservoir resampling for real-time ray tracing with dynamic direct
lighting [Bitterli et al. 2020]

5

デノイザーの未来とセッションまとめ

6.2. セッションまとめ

リアルタイムレイトレーシングにおけるデノイザーの実装について紹介
・Spatial Accumulation
・Temporal Accumulation
・デノイザーの設計
・種々のテクニックや考察点の紹介
今回は鏡面反射のみ
今後は半透明の扱いなども取り組んでいく
機械学習ベースの手法も今後のターゲット©Silicon Studio Corp., all rights reserved.

©Silicon
Studio Corp., all rights reserved.
©Silicon Studio Corp., all rights reserved.