$30 off During Our Annual Pro Sale. View Details »

微分可能レンダラのつくりかた ~理論からVulkan実装まで~

u
September 24, 2023

微分可能レンダラのつくりかた ~理論からVulkan実装まで~

Visual Computing (VC) 2023で行ったチュートリアルの資料です.元はアニメーションと動画が入ったパワーポイントですがPDFにバラしてアップロードしています.

VCへのリンク:
https://visualcomputing.jp/vc2023/tutorial/#tutorial_sato

日時:
2023/09/17 芝浦工業大学・豊洲キャンパス 14:30-15:30

概要:
微分可能レンダリングは二次元画像を損失関数に使用し三次元シーンの最適化を行うための技術であり, グラフィックスのみならずビジョンや機械学習の分野でも注目を集めています. 本チュートリアルでは微分可能レンダリングの基礎知識と実装についてリアルタイムグラフィックスの観点から解説します. まずレンダリングパイプラインを微分可能に拡張する際の課題と,それらを克服するためのテクニックを解説します. さらにOpenGLやニューラルネットワーク用の自動微分ライブラリを用いた実装には改善の余地があることを示し, 現代的なグラフィックスAPIであるVulkanを用いた効率的な実装を紹介します.関連する最新の研究についても紹介します.

u

September 24, 2023
Tweet

Other Decks in Research

Transcript

  1. Visual Computing (VC) 2023チュートリアル
    微分可能レンダラのつくりかた
    ~理論から 実装まで~
    2023/09/17 芝浦工業大学・豊洲キャンパス 14:30-15:30
    佐藤浩之
    滝本佑介
    Digital Human Lab, Tokyo Research Center, Huawei
    𝜕
    𝜕𝜃

    View Slide

  2. Huawei紹介

    View Slide

  3. Huawei紹介
    • スマホ,通信が有名
    • 近年は法人向けクラウドサービスに注力
    3

    View Slide

  4. Huawei Japan紹介
    • R&D拠点
    • 横浜
    • 船橋
    • 大阪
    • 東京(品川):メディア
    • 音系:ノイズキャンセリングイヤホン等
    • PV:https://www.youtube.com/watch?v=wcj4G2wUiDM
    • Huawei公式ASMR (!?):https://www.youtube.com/watch?v=0_Lg5rP_rRU
    • カメラ系:スマホ向け等
    • CG系:デジタルヒューマン
    HUAWEI FreeBuds Pro 2 (2022)
    4

    View Slide

  5. HuaweiのCG
    • 中国本社:数拠点
    • 海外研究所:たくさん
    日本:デジタルヒューマンサービスに向けた開発よりの研究開発
    5
    MetaStudio

    View Slide

  6. 日本のDigital Human Lab
    アニメーション
    ユーザーによる編集
    リコンストラクション
    =インバースレンダリング
    レンダリング+AI
    CG Rendering CG + AI
    入力:画像
    デジタルヒューマン
    プラットフォーム
    6
    Vulkan実装の
    内製微分可能レンダラ
    EG2022
    VC2022招待講演

    View Slide

  7. 本編

    View Slide

  8. 微分可能レンダラ/レンダリングとは
    • 画像のロスをBackwardできるレンダラ/レンダリング
    • 勾配ベースの最適化(SGD, Adam等)で3Dシーンを最適化できる
    3Dシーンパラメータ 𝜃
    レンダー画像 ターゲット画像
    2D画像
    8
    Backward
    (パラメータ更新)
    微分可能
    レンダラ
    ロス
    𝜕
    𝜕𝜃
    Forward
    (通常のレンダリング)

    View Slide

  9. 微分可能レンダラ/レンダリングとは
    • 画像のロスをBackwardできるレンダラ/レンダリング
    • 勾配ベースの最適化(SGD, Adam等)で3Dシーンを最適化できる
    3Dシーンパラメータ 𝜃
    レンダー画像 ターゲット画像
    2D画像
    9
    Backward
    (パラメータ更新)
    微分可能
    レンダラ
    ロス
    𝜕
    𝜕𝜃
    Forward
    (通常のレンダリング)

    View Slide

  10. 微分可能レンダラ/レンダリングとは
    • 画像のロスをBackwardできるレンダラ/レンダリング
    • 勾配ベースの最適化(SGD, Adam等)で3Dシーンを最適化できる
    3Dシーンパラメータ 𝜃
    レンダー画像 ターゲット画像
    2D画像
    10
    Backward
    (パラメータ更新)
    微分可能
    レンダラ
    ロス
    𝜕
    𝜕𝜃
    Forward
    (通常のレンダリング)

    View Slide

  11. 微分可能レンダリングだけでできること:
    3Dシーンの最適化
    テクスチャ
    頂点位置 カメラポーズ 3DMM
    (パラメトリックモデル)
    ライト
    https://github.com/ascust/3DMM-Fitting-Pytorch
    SoftRas [Liu+ 2019] PyTorch3D [Ravi+ 2020] Nvdiffrec [Munkberg+ 2022]
    Dressi [Takimoto+ 2022]
    などなど、レンダリングに登場する概念は(ほぼ)全て最適化できる
    11

    View Slide

  12. 最近のCG/CVのトレンド:
    画像(2D)・テキスト → 3D
    • 画像でロスを計算して3DにBackwardするモジュールとして
    微分可能レンダリングが使われている!
    Magic3D [Lin+ 2023]
    NeRF 生成AI / LLM + Diffusion Model
    [Mildenhall+ 2020]
    12

    View Slide

  13. 本講演のゴール
    •微分可能レンダリングを
    •知る(佐藤)
    •つくる(滝本)
    13

    View Slide

  14. 本講演のゴール
    •微分可能レンダリングを
    •知る(佐藤)
    •つくる(滝本)
    14

    View Slide

  15. 自己紹介 佐藤浩之
    • Digital Human Lab, Tokyo Research Center, Huawei
    • 3Dコンピュータビジョンとグラフィックスの研究開発
    • 学歴
    • 2007-2011 東北大学工学部
    • 本当は哲学を学びたかった
    • 文学部哲学科卒の教授の元で関数型言語を研究
    • 2011-2013 東京大学大学院修士
    • AI(Deep以前)が面白そうと思い進化計算を研究
    • 職歴
    • 2013-2017 キヤノン株式会社
    • 成り行きで3Dコンピュータビジョンをやりはじめる
    • 2017-現職
    • グラフィックスもやらざるを得なくなる
    • 好きなCG系研究者
    • Alec Jacobson, Olga Sorkine-Hornung , Kun Zhou
    15
    残念ながら今回の話にはほとんど出てこない……

    View Slide

  16. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    ◆ラスタライズの微分可能性
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    16

    View Slide

  17. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    ◆ラスタライズの微分可能性
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    17

    View Slide

  18. 用語と前置き
    • 微分可能レンダリング:Differentiable Rendering、DR
    • 微分可能レンダラ:Differentiable Renderer、DR
    • 2種類ある
    • 画像生成ネットワーク
    • 古典的レンダリングパイプラインを拡張
    RenderNet [Nguyen-Phuoc+ 2018] [Kips+ 2022]
    18
    DRがどちらを指す
    かは文脈による

    View Slide

  19. メッシュは使いやすいが微分可能レンダリングが難しい
    19
    本講演ではメッシュのラスタライゼーションベース
    微分可能レンダリングを解説
    クオリティ
    CGツールのサポート ×
    標準フォーマットなし

    標準フォーマット多数
    微分可能レンダリング 容易
    レイに添ったサンプリング→足し算と掛け算
    →明らかに微分可能&密な勾配
    難しい
    Explicitな面の存在により
    不連続性=微分不能性が発生
    NeRF [Mildenhall+ 2020]
    (≒ボリューム)
    メッシュ
    ◎ △~◎
    https://github.com/facebookresearch/pytorch3d

    View Slide

  20. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    20

    View Slide

  21. ラスタライゼーションベースの
    リアルタイムレンダリング
    • メッシュが主な入力
    • ハードウェアラスタライザを用いた高速な(30fps~)レンダリング
    • インタラクティブ性が求められるアプリケーションで用いられる
    • レイトレーシングよりもクオリティは劣る

    • ビュワー
    • 編集ツールのビューポート
    • Blender (Eevee), Maya
    • ゲームエンジン
    • Unity, UnrealEngine
    3Dビューアー
    (Windows)
    Xcode
    (mac)
    Meshlab
    ビュワーの例
    21

    View Slide

  22. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    22

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算

    View Slide

  23. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    23

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    微分可能にするには?
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算

    View Slide

  24. 計算機による微分計算
    • 記号微分(symbolic differentiation)
    • 人間と同じようなやり方で記号的に微分する
    • 例:Wolfram alpha
    • https://ja.wolframalpha.com/
    • 数値微分(numerical differentiation)
    • 微分の定義そのもの
    • 近似値しか求まらない
    • 差分hがハイパーパラメータ、不安定になることも
    • 自動微分(automatic differentiation, AD)
    • Forward mode
    • Ceres solver
    • Reverse mode
    • PyTorch, TensorFlow, JAX のデフォルト
    24

    View Slide

  25. 計算機による微分計算
    • 記号微分(symbolic differentiation)
    • 人間と同じようなやり方で記号的に微分する
    • 例:Wolfram alpha
    • https://ja.wolframalpha.com/
    • 数値微分(numerical differentiation)
    • 微分の定義そのもの
    • 近似値しか求まらない
    • 差分hがハイパーパラメータ、不安定になることも
    • 自動微分(automatic differentiation, AD)
    • Forward mode
    • Ceres solver
    • Reverse mode
    • PyTorch, TensorFlow, JAX のデフォルト
    高速で高精度
    25

    View Slide

  26. 自動微分(AD)で用いられる計算グラフ
    • 計算の過程をグラフで表現
    𝐿 𝑥 =(log 𝑥 − 1)2
    26

    View Slide

  27. 自動微分(AD)で用いられる計算グラフ
    • 計算の過程をグラフで表現
    𝐿 𝑥 =(log 𝑥 − 1)2
    27
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥

    View Slide

  28. 自動微分(AD)で用いられる計算グラフ
    • 計算の過程をグラフで表現
    𝐿 𝑥 =(log 𝑥 − 1)2
    x log
    1
    Subtract
    y z Multiply l L
    28
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥

    View Slide

  29. 自動微分(AD)で用いられる計算グラフ
    • 計算の過程をグラフで表現
    𝐿 𝑥 =(log 𝑥 − 1)2
    Forward: 入力から計算グラフを順に辿ってロスを計算
    x log
    1
    Subtract
    y z Multiply l L
    29
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥

    View Slide

  30. Reverse mode AD(Reverse modeの自動微分)
    x log
    1
    Subtract
    y z Multiply l L
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
    Forward: 入力から計算グラフを順に辿ってロスを計算
    30

    View Slide

  31. Reverse mode AD(Reverse modeの自動微分)
    x log
    1
    Subtract
    y z Multiply l L
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
    Forward: 入力から計算グラフを順に辿ってロスを計算
    PyTorch:
    loss.backward()
    31

    View Slide

  32. Reverse mode AD(Reverse modeの自動微分)
    x log
    1
    Subtract
    y z Multiply l L
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
    Forward: 入力から計算グラフを順に辿ってロスを計算
    𝜕𝑙
    𝜕𝑧
    = 2𝑧
    𝜕𝑧
    𝜕𝑦
    = 1
    𝜕𝑦
    𝜕𝑥
    =
    1
    𝑥
    𝜕𝐿
    𝜕𝑙
    = 1
    𝜕𝐿
    𝜕𝑧
    𝜕𝐿
    𝜕𝑦
    𝜕𝐿
    𝜕𝑥
    PyTorch:
    loss.backward()
    32

    View Slide

  33. Reverse mode AD(Reverse modeの自動微分)
    x log
    1
    Subtract
    y z Multiply l L
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
    Forward: 入力から計算グラフを順に辿ってロスを計算
    𝜕𝑙
    𝜕𝑧
    = 2𝑧
    𝜕𝑧
    𝜕𝑦
    = 1
    𝜕𝑦
    𝜕𝑥
    =
    1
    𝑥
    𝜕𝐿
    𝜕𝑙
    = 1
    𝜕𝐿
    𝜕𝑧
    𝜕𝐿
    𝜕𝑦
    𝜕𝐿
    𝜕𝑥
    Backward: ロスから計算グラフを逆に辿って入力の勾配値を計算
    𝜕𝐿
    𝜕𝑥

    𝑥=𝑥′
    =
    𝜕𝐿
    𝜕𝑙
    𝜕𝑙
    𝜕𝑧
    𝜕𝑧
    𝜕𝑦
    𝜕𝑦
    𝜕𝑥
    ቚ {𝑙=𝑙′, 𝑧=𝑧′
    𝑦=𝑦′, 𝑥=𝑥′}
    = 2𝑧 ቚ
    𝑧=𝑧′
    1
    𝑥

    𝑥=𝑥′
    =
    2(log 𝑥 − 1)
    𝑥

    𝑥=𝑥′
    チェインルール 解析解
    計算した値
    PyTorch:
    loss.backward()
    33

    View Slide

  34. Reverse mode AD(Reverse modeの自動微分)
    x log
    1
    Subtract
    y z Multiply l L
    (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
    Forward: 入力から計算グラフを順に辿ってロスを計算
    𝜕𝑙
    𝜕𝑧
    = 2𝑧
    𝜕𝑧
    𝜕𝑦
    = 1
    𝜕𝑦
    𝜕𝑥
    =
    1
    𝑥
    𝜕𝐿
    𝜕𝑙
    = 1
    𝜕𝐿
    𝜕𝑧
    𝜕𝐿
    𝜕𝑦
    𝜕𝐿
    𝜕𝑥
    PyTorch:
    optimizer.step()
    更新: 勾配値で入力を更新
    Backward: ロスから計算グラフを逆に辿って入力の勾配値を計算
    𝜕𝐿
    𝜕𝑥

    𝑥=𝑥′
    =
    𝜕𝐿
    𝜕𝑙
    𝜕𝑙
    𝜕𝑧
    𝜕𝑧
    𝜕𝑦
    𝜕𝑦
    𝜕𝑥
    ቚ {𝑙=𝑙′, 𝑧=𝑧′
    𝑦=𝑦′, 𝑥=𝑥′}
    = 2𝑧 ቚ
    𝑧=𝑧′
    1
    𝑥

    𝑥=𝑥′
    =
    2(log 𝑥 − 1)
    𝑥

    𝑥=𝑥′
    チェインルール 解析解
    計算した値
    PyTorch:
    loss.backward()
    34

    View Slide

  35. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    35

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算

    View Slide

  36. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    36

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    行列演算
    =足し算&掛け算
    =微分可能

    View Slide

  37. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    37

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能

    View Slide

  38. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    38

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換 ラスタライズ シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    頂点毎から
    ピクセル毎への変換
    微分可能?
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能

    View Slide

  39. ラスタライズ(広義)は2ステップからなる
    1. ラスタライズ(狭義):
    ピクセルが対応する三角形IDを求める
    2. Barycentric補間:
    1. ピクセルが対応するBarycentric coordinateの計算(三角形内の相対的な位置、面積比)
    • u, v, wの3パラメータ(和が1なので実質2パラメータ)
    2. 頂点属性を線形補間
    out vec4 FragColor;
    uniform sampler2D color_tex;
    in vec2 TexCoords;
    void main() {
    vec3 color = texture(color_tex, TexCoords).rgb;
    FragColor = vec4(color, 1.0);
    }
    補完まで終わっている!
    https://www.scratchapixel.com/lessons/3d-
    basic-rendering/rasterization-practical-
    implementation/perspective-correct-
    interpolation-vertex-attributes.html
    GLSLの例
    • GPUで効率的に行われる
    • フラグメントシェーダの入力の時点で自動で補完まで済んでいる
    • “通常の”シェーダ開発者は意識する必要はない
    𝑝𝑖
    = u𝑣0
    + v𝑣1
    + w𝑣2
    ピクセルiの値
    三角形の各頂点属性
    39

    View Slide

  40. ラスタライズ(広義)を自動微分で書いたら?
    • ラスタライズ(狭義)
    • ハードウェアラスタライザによるラスタライズは高速だが微分不能
    • ソフトウェア(自動微分)によるラスタライズは遅い(しかも結局微分不能)
    • ニューラルネットワーク用のテンソルベースの自動微分ライブラリによる実装は特に遅い
    • shape:(ピクセル数, Face数, Gbuffer数)
    • テンソル演算のブロードキャストの枠組みではIf分岐を全て評価する必要がありさらにはbreakによる処理
    の打ち切りができない ↔ Culling
    • 弊チームで実装経験あり、1Kで一枚描くのに1時間くらい?
    • 結局ハードウェアラスタライザと同様に三角形IDを計算→整数値でありBackwardで役に立たない
    • Barycentric補間
    • Barycentric coordinateの計算も線形補間も自動微分で問題なく書ける
    • 結論の先取り:ラスタライズ(狭義)は微分不能でよい
    ハードウェアラスタライザを使ってよい
    40

    View Slide

  41. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    41

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換
    ラスタライズ
    (広義)
    シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能

    View Slide

  42. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    42

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換
    ラスタライズ
    (広義)
    シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    ラスタライズ(狭義)は微分不能
    Barycentric補間は微分可能
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能

    View Slide

  43. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    43

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換
    ラスタライズ
    (広義)
    シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    ラスタライズ(狭義)は微分不能
    Barycentric補間は微分可能
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能
    ピクセル毎の計算
    微分可能

    View Slide

  44. リアルタイムレンダリングの
    グラフィックスパイプライン
    頂点属性 レンダー画像
    頂点毎の計算 離散化
    カメラ
    位置
    Tex coord.

    モデルビュー
    変換
    44

    Y
    Z
    離散的なピクセルを生成
    三角形を塗る
    投影変換
    ラスタライズ
    (広義)
    シェーディング ポストプロセス
    ライト
    テクスチャ
    3Dから3Dの変換
    最終的にカメラ座
    標に変換
    3Dから2Dに変換
    三角形内部は
    スカスカ
    離散的な
    ピクセルを生成
    三角形を塗る
    テクスチャ
    サンプルと
    陰影計算
    見た目を向上
    輪郭をボカす(アン
    チエイリアス)等
    https://nvlabs.github.io/nvdiffrast/
    ※アニメーション、テッセレーショ
    ン、ジオメトリシェーダetcは省略
    ピクセル毎の計算
    ラスタライズ(狭義)は微分不能
    Barycentric補間は微分可能
    行列演算
    =足し算&掛け算
    =微分可能
    行列演算
    (+Z割り算)
    =微分可能
    ピクセル毎の計算
    微分可能
    これも
    ピクセル毎の計算
    微分可能

    View Slide

  45. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    Backward可能
    離散化
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    45

    View Slide

  46. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    46
    ラスタライズ(広義)

    View Slide

  47. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    47
    https://nvlabs.github.io/nvdiffrast/
    ラスタライズ(広義)

    View Slide

  48. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    Barycentric補間
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    48
    https://nvlabs.github.io/nvdiffrast/
    ラスタライズ(広義)

    View Slide

  49. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    Barycentric補間
    Texture coord.
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    49
    https://nvlabs.github.io/nvdiffrast/
    = u + v + w
    ラスタライズ(広義)

    View Slide

  50. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    50
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    = u + v + w
    ラスタライズ(広義)

    View Slide

  51. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    51
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    = u + v + w
    ラスタライズ(広義)

    View Slide

  52. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    52
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)

    View Slide

  53. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    レンダー画像
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    53
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)

    View Slide

  54. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    レンダー画像
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    ロス計算
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    モデルビュー変換
    54
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)

    View Slide

  55. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    レンダー画像
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    ロス計算
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    ピクセルのロスは
    1. Barycentric補間
    2. ポストプロセス(ブラーやアンチエイリアス)
    によって頂点属性までBackwardされる
    モデルビュー変換
    55
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)

    View Slide

  56. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    レンダー画像
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    ロス計算
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    ピクセルのロスは
    1. Barycentric補間
    2. ポストプロセス(ブラーやアンチエイリアス)
    によって頂点属性までBackwardされる
    モデルビュー変換
    56
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)
    シェーディング勾配

    View Slide

  57. グラフィックスパイプラインを計算グラフの観点から
    頂点属性
    レンダー画像
    投影変換
    三角形ID
    三角形ID : 5
    頂点ID :
    (0, 10, 11)
    シェーディング
    Barycentric補間
    Texture coord.
    テクスチャ
    サンプル
    Backward可能
    離散化
    ラスタライズ(狭義)
    CUDA, OpenGL, Vulkan, …
    ロス計算
    カメラ
    ライト
    ターゲット画像
    Backward不能
    位置
    Texture coord.

    ピクセルのロスは
    1. Barycentric補間
    2. ポストプロセス(ブラーやアンチエイリアス)
    によって頂点属性までBackwardされる
    モデルビュー変換
    57
    テクスチャ
    https://nvlabs.github.io/nvdiffrast/
    ポストプロセス
    ブラーやアンチエイリアス
    = u + v + w
    ラスタライズ(広義)
    シェーディング勾配
    シルエット勾配

    View Slide

  58. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    58

    View Slide

  59. 微分可能レンダリングの2種類の勾配
    59
    1. シェーディング勾配:
    画像中の色が変化するパラメータを最適化可能
    • テクスチャ、ライト、法線…
    • 色の変化に基づいて形状も最適化可能な場合あり、シェー
    ディング手法に依存
    • 可能な場合でも勾配は弱い、形状の変化に対して色の変化が小さいため
    • シルエット、unlit&フラットなテクスチャ等色がフラットなシェーディ
    ングでは形状は最適化不能
    2. シルエット勾配:
    画像中の形状が変化するパラメータを最適化可能
    • 頂点位置、パラメトリックモデル、カメラパラ
    メータ…
    • カメラのビュー方向(Z方向)の形状は最適化できない(シルエットに
    関係ないため)ので,シェーディング勾配に頼る必要がある
    [Nicolet + 2021] による分類
    𝜕
    𝜕𝜃
    勾配の種類によって
    何ができるか大きく変わる!
    Barycentric補間のBackwardに対応
    ポストプロセスのBackwardに対応

    View Slide

  60. シルエット勾配がない=ポストプロセスがない場合
    左上にずれている
    ターゲット画像
    投影変換後
    レンダー画像
    (ポストプロセスなし)
    画像中で頂点を左上方向に動かす勾配がない!
    ピクセル単位のロス
    ?
    ラスタライズ&
    Barytentric補間

    60

    View Slide

  61. シルエット勾配がある
    =ラスタライズ前のジオメトリ情報を使うポストプロセスがある場合
    ロスを減らす=色を白くするには
    三角形エッジまでの距離 が近くなればよい
    距離が近くなる方向に頂点 を移動すればよい
    左上にずれている
    ターゲット画像
    投影変換後 シェーディング後

    ラスタライズ
    &Barytentric補間
    &シェーディング
    ジオメトリ情報を使うポストプロセス
    ブラーやアンチエイリアス
    ボケた
    レンダー画像
    ラスタライズ前のジオメトリ情報を使うポストプロセスにより
    ジオメトリが移動すべき方向が色にエンコードされる!
    ラスタライズ前のジオメトリを
    参照してピクセルと距離計算
    61

    View Slide

  62. 単純にブラーすればシルエット勾配が出る?
    62
    ほぼ同じ絵だが
    計算過程が異なる
    ピクセルとピクセルの距離 で重みが決まる
    →色を見てもジオメトリの情報は何もわからない
    “普通の”ブラー(ガウシアンブラー、ボックスブラー、etc)
    ピクセルとジオメトリ間の距離 で重みが決まる
    →ジオメトリの移動すべき方向が色に反映!
    シェーディング後
    ラスタライズ前の
    ジオメトリ情報
    Backward可能
    ブラー
    ブラー
    DRのブラー

    カーネルの畳み込み
    距離計算
    シルエット勾配
    でBackward
    シェーディング勾配
    でBackward

    View Slide

  63. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    63

    View Slide

  64. シルエット勾配の生成方法
    64
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能

    View Slide

  65. シルエット勾配の生成方法
    65
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張

    View Slide

  66. シルエット勾配の生成方法
    66
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致

    View Slide

  67. シルエット勾配の生成方法
    67
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致
    ピクセルとジオメトリを直接距離計算で繋ぐ

    View Slide

  68. SoftRas [Liu+ 2019]
    ReDA [Zhu+ 2020]
    HardSoftRas/Dressi
    [Takimoto+ 2022]
    PyTorch3D
    [Ravi+ 2020]
    DIB-R [Chen+ 2019]
    ハードウェアラスタライザで高速化
    シルエット内部の
    アーティファクトを抑制
    範囲閾値により
    計算量削減
    Soft Rasterization
    GenDR [Zhu+ 2022]
    距離計算方法等を分析
    線形が一番良い
    顔用に拡張
    セグメンテーションマスク等
    スクリーンスペース&デプス方向、広範囲にブラー
    シルエット勾配の生成方法
    68
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致
    ピクセルとジオメトリを直接距離計算で繋ぐ

    View Slide

  69. SoftRas [Liu+ 2019]
    ReDA [Zhu+ 2020]
    HardSoftRas/Dressi
    [Takimoto+ 2022]
    PyTorch3D
    [Ravi+ 2020]
    DIB-R [Chen+ 2019]
    ハードウェアラスタライザで高速化
    シルエット内部の
    アーティファクトを抑制
    範囲閾値により
    計算量削減
    Soft Rasterization
    GenDR [Zhu+ 2022]
    距離計算方法等を分析
    線形が一番良い
    顔用に拡張
    セグメンテーションマスク等
    スクリーンスペース&デプス方向、広範囲にブラー
    シルエット勾配の生成方法
    69
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    Anti-aliasing
    nvdiffrast [Laine+ 2020]
    グラフィックスパイプラインと整合性あり
    数学的に微分可能
    エッジの一部、1ピクセル未満のブラー
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致
    ピクセルとジオメトリを直接距離計算で繋ぐ

    View Slide

  70. SoftRas [Liu+ 2019]
    ReDA [Zhu+ 2020]
    HardSoftRas/Dressi
    [Takimoto+ 2022]
    PyTorch3D
    [Ravi+ 2020]
    DIB-R [Chen+ 2019]
    ハードウェアラスタライザで高速化
    シルエット内部の
    アーティファクトを抑制
    範囲閾値により
    計算量削減
    Soft Rasterization
    GenDR [Zhu+ 2022]
    距離計算方法等を分析
    線形が一番良い
    顔用に拡張
    セグメンテーションマスク等
    スクリーンスペース&デプス方向、広範囲にブラー
    シルエット勾配の生成方法
    70
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    Anti-aliasing
    nvdiffrast [Laine+ 2020]
    グラフィックスパイプラインと整合性あり
    数学的に微分可能
    エッジの一部、1ピクセル未満のブラー
    ピクセル位置を補間で求めて繋ぐ
    補間で求めたピクセル位置にカーネルを畳み込む
    三角形以外にも適用可能
    rasterize-then-splat
    [Cole+ 2021]
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致
    ピクセルとジオメトリを直接距離計算で繋ぐ

    View Slide

  71. SoftRas [Liu+ 2019]
    ReDA [Zhu+ 2020]
    HardSoftRas/Dressi
    [Takimoto+ 2022]
    PyTorch3D
    [Ravi+ 2020]
    DIB-R [Chen+ 2019]
    ハードウェアラスタライザで高速化
    シルエット内部の
    アーティファクトを抑制
    範囲閾値により
    計算量削減
    Soft Rasterization
    GenDR [Zhu+ 2022]
    距離計算方法等を分析
    線形が一番良い
    顔用に拡張
    セグメンテーションマスク等
    スクリーンスペース&デプス方向、広範囲にブラー
    シルエット勾配の生成方法
    71
    tf_mesh_renderer
    [Genova+ 2018]
    シェーディング勾配のみ
    Backward可能
    Forwardそのまま
    Backwardを疑似的に生成
    OpenDR [Loper & Black 2014]
    NMR [Kato+ 2018]
    ネットワークの学習用に
    スクリーンスペースで勾配が届く範囲を拡張
    Anti-aliasing
    nvdiffrast [Laine+ 2020]
    グラフィックスパイプラインと整合性あり
    数学的に微分可能
    エッジの一部、1ピクセル未満のブラー
    ピクセル位置を補間で求めて繋ぐ
    補間で求めたピクセル位置にカーネルを畳み込む
    三角形以外にも適用可能
    rasterize-then-splat
    [Cole+ 2021]
    ピクセルと三角形を計算グラフ上で繋ぐ
    ForwardとBackward一致
    ピクセルとジオメトリを直接距離計算で繋ぐ
    1
    2 3
    4

    View Slide

  72. Backwardを疑似的に生成:
    OpenDR & Neural 3D Mesh Renderer (NMR)
    • Forward:普通に絵を描く
    • Backward:疑似的にシルエット勾配を生成する
    • Backwardだけポストプロセスをするイメージ
    • 欠点
    • 数学的に微分可能でない=BackwardがForwardの導関数ではない
    • 調節が難しい
    • 自動微分で書けない
    72
    OpenDR [Looper & Black 2014]
    NMR [Kato+ 2018]
    Forward Backward
    Backward
    XY方向に広げる
    少しだけ広げる
    SoftRas [Liu+ 2019]の比較図 SoftRas [Liu+ 2019]の比較図
    これまで説明してきた手法とはアプ
    ローチが異なるが、DRの歴史的に重要
    1

    View Slide

  73. SoftRas:スクリーンスペース&デプス
    方向で広範囲にブラー
    • スクリーンスペース距離とデプス値に基づい
    て、近いほど濃くなるように三角形の色を混
    ぜるポストプロセス
    • 全ピクセルで全三角形の色を混ぜる
    • (height, width, 全三角形数 (デプスバッファ))のテンソルを確
    保する必要あり
    73
    三角形エッジとピクセルの
    2Dスクリーンスペース距離でブラー
    オクルージョンされている三角形も考慮し、
    デプス方向に色をブレンド
    距離にシグモイド
    をかけて色を減衰
    デプスの逆数に基づいた重み
    2

    View Slide

  74. SoftRas:スクリーンスペース&デプス
    方向で広範囲にブラー
    • 利点
    • 最適化もネットワーク学習も上手くいく
    • 色のボケ具合と勾配がリンクしているのでハイパーパ
    ラメータをチューニングしやすい
    • 欠点
    • ハードウェアラスタライザが使えず遅い
    • レンダリングされた絵がボケていてクオリティが低い
    • 古典的レンダリングと矛盾
    • 遠くの色が混ざる
    • 透明でない物体も透ける
    74
    2

    View Slide

  75. SoftRasの発展形
    • PyTorch3D
    • スクリーンスペースとデプスバッファの閾
    値を導入して計算量を削減
    • DIB-R
    • シルエット内部のアーティファクトを抑制
    • HardSoftRas/Dressi
    • ハードウェアラスタライザで高速化
    • [PR] 実装はクローズドだが世界最速
    75
    DIB-R SoftRas
    2

    View Slide

  76. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    76
    CV ML
    3

    View Slide

  77. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    77
    CV ML
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3

    View Slide

  78. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    78
    CV ML
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    3

    View Slide

  79. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    79
    CV ML
    CVPRとNeurIPSの論文
    が楽しみだな!!!
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    3

    View Slide

  80. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    80
    CV ML CG
    CVPRとNeurIPSの論文
    が楽しみだな!!!
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    3

    View Slide

  81. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    81
    CV ML CG
    CVPRとNeurIPSの論文
    が楽しみだな!!!
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    3

    View Slide

  82. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    82
    CV ML CG
    CVPRとNeurIPSの論文
    が楽しみだな!!!
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    3

    View Slide

  83. 2018~2020年(NMRやSoftRasが広く使われだした頃)の
    微分可能レンダリングの雰囲気(主観)
    83
    CV ML CG
    CVPRとNeurIPSの論文
    が楽しみだな!!!
    [Kanazawa+ 2018]
    ついにレンダリングも
    微分可能になった!
    ビジョン系の学習
    が上手くいってる!
    3Dでもどんどんネットワー
    ク学習していこうぜ!
    意訳:
    NMRやSoftRasは遅くて、絵が綺麗ではない
    グラフィックス分野の知見を活用しきれていない
    3

    View Slide

  84. 84
    84
    3

    View Slide

  85. 85
    85
    3

    View Slide

  86. 86
    86
    3

    View Slide

  87. 87
    87
    3

    View Slide

  88. 88
    北欧のリアルタイムグラフィックスの達人たち!
    (StyleGAN, PGGAN, Noise2Noise等の作者でもある)
    88
    3

    View Slide

  89. nvdiffrast :アンチエイリアスでブラー
    • Contribution 1: アンチエイリアス
    • 前面、一部のエッジ、1ピクセル未満のスクリーンスペー
    ス距離に基づくブラー
    • 処理自体はSoftRasに近いが、範囲を絞っている
    • シルエット勾配のBackward用にジオメトリ情報を計算に組み入れる
    必要があるため、Geometric anti-aliasingを選択
    • 数学的に微分可能 (Analytic Anti-Aliasing)
    • 古典的グラフィックスパイプラインに使われているポス
    トプロセスであり絵のクオリティが上がる
    ↔SoftRasの絵はクオリティが低い
    • ラスタライズはOpenGLで行うため高速
    • 最近CUDAラスタライザも実装された模様
    • 複数GPUでOpenGLが動かない場合に対応
    • (なぜVulkanにしなかったのか……)
    89
    3

    View Slide

  90. nvdiffrast :アンチエイリアスでブラー
    • Contribution2: DRライブラリに必須のAPIを特定
    • ドキュメントが非常に良く書かれている、一見の価値あり
    • https://nvlabs.github.io/nvdiffrast/
    • CGの達人によるエレガントな微分可能レンダラ
    • 古典的グラフィックスパイプラインを理論的に綺麗に維持しつ
    つ形状も最適化できる
    • 欠点
    • アンチエイリアスの性質的に一部のピクセルしかブラーされない
    →シルエット勾配がスパースになり形状最適化が不安定
    • しかしこの欠点もlarge steps [Nicolet + 2021]で解消され最強に(後半で解説)
    • 数学的に微分可能だが自動微分で書かれておらず
    手動で導関数を記述している
    • 例:BarycentricはForwardはラスタライザ、BackwardはCUDAで計算.速度は出
    るが……
    90
    nvdiffrast特有のスパースな勾配
    Dressi [Takimoto + 2022]の比較より
    3

    View Slide

  91. rasterize-then-splat :
    ピクセル位置を補完で求めて繋ぐ
    GBufferを微分不能にラスタライズしてから
    1. ピクセル位置をジオメトリ情報から補間に基づいて求める
    • この処理によりピクセルとジオメトリが繋がる
    2. “普通のブラー”をかけ色をボカす (Splat)
    • 点群レンダリング手法 Surface splatting [Zwicker+ 2001]にインスパイア
    • 利点:GBufferさえあれば適用できるので
    • ハードウェアラスタライザが使える
    • 三角形に限らず適用できる(パラメトリックカーブやSDF等)
    • 欠点
    • 実際使ってみると不安定、ロバスト性に欠ける
    • TensorFlowGraphics, PyTorch3Dに実装されている
    91
    補間によって求めたピクセル位置間の距離
    でウェイトを定義し
    畳み込む
    ジオメトリ情報から
    補間によってピクセル位置を計算


    1
    4

    View Slide

  92. 微分可能レンダリングを知る
    1. 導入
    2. リアルタイムレンダリングと自動微分
    3. 微分可能レンダリングの2種類の勾配
    1. シェーディング勾配
    2. シルエット勾配
    ◆様々な手法の紹介
    4. まとめ
    92

    View Slide

  93. 前半のまとめ
    • シェーディング勾配:Barycentric補間
    • テクスチャやライトが最適化できる
    • シルエット勾配:ジオメトリ情報を用いた
    ポストプロセス
    • ジオメトリやカメラパラメータが最適化できる
    • オープンな微分可能レンダラで最もエレガントなのはnvdiffrast(主観)
    • [PR] 我々が内製した はエレガントで最速だがクローズド
    • おすすめオープン実装
    • ネットワーク学習用:PyTorch3D、DIB-R (Kaolin)
    • 最適化用:nvdiffrast + large steps [Nicolet+ 2021](後半で説明)
    93
    令和5年9月現在
    微分可能レンダリングの2種類の勾配

    View Slide

  94. 後半に向けた問題提起
    • ここまで見てきた手法は微分可能“レンダラ”なのに普通のレン
    ダラやCGツールとは全然別物
    • シェーダで実装される部分がPyTorchやCUDAで実装されている
    • 微分可能レンダラを“普通のレンダラ”に近づけられないか?
    • 後半へ続く……
    94

    View Slide

  95. 本講演のゴール
    •微分可能レンダリングを
    •知る(佐藤)
    •つくる(滝本)
    95

    View Slide

  96. 自己紹介
    滝本佑介
    • Digital Human Lab,Tokyo Research Center, Huawei
    • 3Dグラフィックスの研究開発
    • 学歴
    • 2013-2017 慶應義塾大学 理工学部
    • Human Interaction用のロボットの制御を研究
    • 2017-2019 慶應義塾大学大学院修士
    • 自然言語処理の研究
    • 2019- 慶應義塾大学大学院博士課程
    • 現在も在学中
    • 職歴
    • 2014-2019 Light Transport Enterainment Inc.
    • アルバイトを通じてCGに携わる
    • 2017- 現職
    • そのままグラフィックが専門になる
    96

    View Slide

  97. 深層学習フレームワークを用いたDR実装
    • 既存のDR
    • / など
    • PyTorchやTensorflow等の深層学習フレームワーク上に実装
    • メリット
    • 自動微分など既存の仕組みを
    活用できる
    • →DRに固有な部分のみを考え
    れば良い
    • デメリット
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    97

    View Slide

  98. 深層学習フレームワークを用いたDR実装
    • しかしDRは非常に遅かった
    • PyTorch3D
    • 単純なシーンでも約10fps
    • Nvdiffrastの登場で改善されたが、
    それでも通常の3DCGには及ばない
    • 3DCGではリアルタイム(1~4K 60fps以上)が当たり前
    • ゲームエンジン/ CGツール
    • GPU上のGraphics専用API 単純なシーン
    なら数百fps
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    98

    View Slide

  99. 深層学習フレームワークを用いたDR実装
    • 深層学習フレームワーク上のDRが遅い理由
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    • 1 . Software Rasterization
    • Nvdiffrast以外はCUDA上のfor loop
    • Hardware Rasterizerは非常に強力
    • 2. 複雑な計算グラフを扱いきれない
    • 深層学習のレイヤー構造はほぼ直列
    • DRは細かな演算が大量の複雑なグラフ
    U-Net DR 99
    1000以上の
    関数

    View Slide

  100. 深層学習フレームワークを用いたDR実装
    • DRはCUDA依存だった
    • 依存する深層学習フレームワーク
    のせい
    • 回避のしようがない
    • 非アカデミックでは特定の企業の製品に
    依存するのは危険
    • 3DCGソフトは任意のGPUで当たり前のように動く
    • -
    • ベンダを跨いだオープンなAPIの上に実装されているから
    • 無論例外もあるが、何かしらの回避策があるもの
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    100

    View Slide

  101. 深層学習フレームワークを用いたDR実装
    • 自動微分が便利だからフレームワークを使っているはずなのに
    DR部分は微分を手動で記述
    • 手書きbackwardはバグの温床
    • 間違っていても気が付きにくい
    • なんとなくで動いてしまう
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    101
    • 本質的に自動微分では書けないところ
    • (狭義の)Rasterization
    ↪ Backwardは定義されない
    • 自動微分でかけるのに手書きをしているところ
    • Blurring / Antialiasing
    • Texture Sampling
    • Barycentric Interpolation
    ↪ 本来は必要ないはずなのに、速度を出すために悪あがき

    View Slide

  102. 3DCG SoftwareとしてのDR
    • Graphics APIでDR特化の自動微分ライブラリを実装する
    • その上にDRのforwardのみを記述する
    • 既存DRの問題点
    • 効率が悪く、遅い
    • あくまで深層学習用だから
    • ベンダー依存
    • CUDA → NVIDIA GPU必須
    • Backwardがバグを含みやすい
    • forward/backwardを手書き
    • DRも3DCGソフトとして記述
    すれば良い
    • GPUが提供するGraphics
    Pipelineで高速に動作
    • ベンダに依らないAPI
    102
    • 全てを自動微分で書けば良い
    • 間違いの無い微分

    View Slide

  103. Vulkanを用いたDR
    • 現代においてクロスプラットホームなGraphics APIはVulkan以外に無い
    OpenGL DirectX 12 Metal Vulkan
    自由度 低 高 高 高
    プラット
    フォーム
    多 Windows Mac 多
    • Graphics APIとしてVulkanを採用
    • Vulkanとは
    • 最新のGraphic API
    • OpenGLの後継
    • 多種多様なOS / GPUでサポート
    • Low Level
    • GLSL(コード)をコンパイルして
    SPIR-V(バイナリ)をGPU上で実
    行する
    103

    View Slide

  104. Vulkanを用いたDR
    • 機能的には申し分ないVulkanの欠点
    • 非常に複雑
    • 多くの人は三角形を描画するまでで力尽きるらしい
    • 下手な実装はかえって遅くなる
    • 複雑なVulkan上で複雑な自動微分ライブラリを実装するのは難しい
    • →多層構造の実装にする
    104

    View Slide

  105. VulkanDRのレイヤー構造
    • ユーザが記述する
    • ≒アプリケーション
    • 本チュートリアルが扱うところ
    • ベンダとOSの仕事
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    Vulkan DRを層構造で実装する
    105

    View Slide

  106. Vulkan入門
    • VulkanはC言語のAPI
    • https://github.com/KhronosGroup/Vulkan-Headers
    • 非常に低レイヤー
    VkInstanceCreateInfo createInfo{};
    createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    VkApplicationInfo appInfo{};
    appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    appInfo.pApplicationName = "AppName";
    appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 0);
    appInfo.pEngineName = "EngineName";
    appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 0);
    appInfo.apiVersion = VK_API_VERSION_1_0;
    createInfo.pApplicationInfo = &appInfo;
    VkInstance instance;
    VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
    if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
    throw std::runtime_error("failed to create instance!");
    }
    例: VkInstanceの作成
    • 空のInstanceCreateInfoを作り
    • CreateInfoを表すEnumをセット
    • CreateInfoのメンバに必要な空の
    structureを作り
    • StructureのEnumをセット
    • メンバを記述して
    • CreateInfoにアドレスをセット
    • 空のInstanceを作り
    • CreateInfoを渡すことでInstanceが確保
    される
    記述量が多すぎて現実的ではない
    106
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  107. C++ Vulkan入門
    現実的な記述量
    • C言語版は記述量が異常に多くなってしまうので
    Khronos公式のC++ Wrapperを使用する
    • VulkanHppとVulkanRAIIの2種類
    • https://github.com/KhronosGroup/Vulkan-Headers
    • or
    • VulkanHpp
    • std::uniqueをベースにしたC++らしい記述スタイル (vk namespace)
    • VulkanRAII
    • VulkanHppを更にwrap (vk::raii namespace)
    • コンストラクタ/デストラクタでリソース管理
    • 弊社ではVulkanHppを使用
    vk::ApplicationInfo app_info = {"AppName", app_version,
    "EngineName", engine_version};
    vk::UniqueInstance instance = vk::createInstanceUnique({{}, &app_info});
    例: VkInstanceの作成
    107
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  108. Vulkanで複雑なグラフを計算する
    • Vulkanで複雑な計算グラフを扱うには?
    • 多入力多出力が可能なShader
    • Fragment Shader
    • Graphics Pipelineの一部
    • ピクセル毎に独立の2D処理
    • Compute Shader
    • Compute Pipeline
    • ピクセルに縛られない自由なテンソル処理が可能
    • Graphics Pipelineの方が最適化の仕組みが揃っている
    • RenderPass と Subpass など
    • Compute Shaderの高い自由度はDRには不必要
    • DRには高々2D Image + 複数channelで十分
    • Vetrex Attribute等 1Dバッファは2D Imageに保存可能
    • Vulkanで性能を求めるならGraphics Pipeline → Fragment Shader
    108
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  109. RenderPassとSubpass
    • 1つのFragment Shaderに全ての計算を入れるのが最速
    • しかし同一ピクセルの値にしかアクセスできない
    • 異なるピクセルの値を使用するにはShaderを分割する
    • 多段のShaderを効率的に実行する仕組み → RenderPass & Subpass
    RenderPass [512x512]
    SubPass
    Vertex Shader
    Tessellation Shader
    Geometry Shader
    Rasterizer
    Fragment Shader
    ...
    109
    ...
    SubPass
    Vertex Shader
    Tessellation Shader
    Geometry Shader
    Rasterizer
    Fragment Shader
    RenderPass [128x128]
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  110. RenderPassとSubpass
    • Input Attachment
    • Subpassの為にFragment Shaderに導入された新しい入力タイプ
    • OpenGLには無い
    • 前段のFragment Shaderの同一pixelの出力を効率的に受け取る
    • OpenGLではTexture Fetchを使用するしかなかった
    • モバイル系のGPUで有効
    • RenderPass内のSubpassは非同期に実行される
    • Dependencyを明示する必要がある
    • Vulkanのドライバが自動で行ってくれる
    110
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  111. SubpassによるDeferred Shading
    • Subpassの非同期機能は効率的なDeferred Shadingのため
    • ある程度のImageのIOを想定している
    111
    →小規模な計算グラフとみなせる
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  112. SubpassによるDeferred Shading
    • Subpassの非同期機能は効率的なDeferred Shadingのため
    • ある程度のImageのIOを想定している
    112
    →小規模な計算グラフとみなせる
    • RenderPass / Subpassの枠組み上にDRの巨大な計算グラフを実装する
    • = DRを記述した計算グラフは究極のDeferred Shading
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  113. DR用のSubpass
    • DRの為に使用するSubpassの使い方は2通り
    • 1. 汎用的な計算
    • Fragment Shaderのみを利用する
    • 他のシェーダは多入力多出力が不可能
    • 2. Rasterize
    • Hardware Rasterizerを利用する
    • Vertex ShaderとFragment Shader
    • 普通のレンダリングと同様
    SubPass
    Vertex Shader
    Rasterizer
    Fragment Shader
    SubPass
    Vertex Shader
    Rasterizer
    Fragment Shader
    113
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  114. RenderPass / Subpassの設定要素
    114
    • Attachment 入出力Image情報
    • Image type
    • Load / Store
    • Image layout 遷移 (メモリアクセスの最適化)
    • Dependency Subpassの依存関係
    • Source
    • Destination
    できるだけ〇〇Optimal
    型を利用する
    vk::Format::eR32Sfloat // 1ch float
    vk::Format::eR32G32B32A32Sfloat // 4ch float
    {vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eDontCare} // 入力
    {vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare} // 出力
    {vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare} // 出力 (0-filled)
    vk::ImageLayout::eShaderReadOnlyOptimal // 入力
    vk::ImageLayout::eColorAttachmentOptimal // 出力
    vk::ImageLayout::eTransferDstOptimal // (CPUからの)転送
    vk::ImageLayout::eGeneral // 汎用 = 最適化されていない
    {vk::PipelineStageFlagBits::eColorAttachmentOutput,
    vk::AccessFlagBits::eColorAttachmentWrite} // Fragment Shaderからの出力
    {vk::PipelineStageFlagBits::eFragmentShader,
    vk::AccessFlagBits::eInputAttachmentRead} // Fragment Shaderへの入力
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  115. 計算グラフ の表現
    • 計算グラフを作るためのインターフェースを作る
    • PyTorchの系譜を参考にした書き方
    • 例) y = sin(x)
    115
    class Variable {
    VType type = VType::FLOAT;
    Size2D size = {512, 512};
    }
    Variable x
    auto y = F::Sin(x)
    FunctionをGLSLがサポートする
    Native関数について必要なだけ
    記述する
    約100個
    namespace F {
    Variable Sin(Variable x) {
    return SinFunction().forward(x)
    }
    }
    class SinFunction {
    Variable forward(Variable x) {
    return Variable{x.type, x.size}
    }
    string glsl_code = "{out}=sin({inp0})"
    }
    出力のVariable
    情報を定義
    対応するGLSLスニペット
    (パワー)
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  116. • 数々の細かな設定を
    Vulkanに施す
    計算グラフのVulkan実行
    116
    RenderPass
    Subpass



    Variable a
    auto b = F::Sin(a)
    ...
    auto z = x * y
    ...
    計算グラフ パッキング
    • RenderPass/Subpass
    の条件を守りながら、
    可能な限り大きな集合
    を作る
    • 同一のImageサイズ
    • RenderPass/Subpass共に
    • 入出力Imageの数
    • デバイスに依存
    • メモリ同期の制約
    • Texture Samplingの参照
    元と先は異なるpass
    RenderPass
    Subpassに変換
    • GLSLコードを文字列
    処理で生成する
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ
    Function &
    Variable

    View Slide

  117. 計算グラフ上で自動微分 (AD)
    • Vulkan ADが完成117
    • 計算グラフをVulkan上で実行できるようになったので、
    自動微分ライブラリ (VulkanAD) を作成する
    • PyTorch等と同様に、Function毎に微分を事前定義する
    • Forwardの計算グラフが入力されると、Forwardと
    Backwardが繋がった計算グラフが出力される
    y = F::Sin(x) BuildBackward gx = gy * F::Cos(x)
    こちらの関係も
    約100個記述する
    Forward
    Forward
    Backward
    BuildBackward
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  118. VulkanADを用いたDR
    • ようやくDRを実装する
    • 自動微分のお陰で、ほぼ一般的なレンダラを書くだけでDifferentiableになる
    118
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  119. 微分可能シェーディング
    • しかしDRのシェーディングは、閲覧用のレンダラと一致する必要がある
    • 異なればターゲット画像の見た目が再現されない
    • 「Physically-based Shading (PBS)」が一般的だが、解釈が様々で皆違う
    119
    • シェーディングもAD上に実装すればよいだけ
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  120. 微分可能シェーディング
    • しかしDRのシェーディングは、閲覧用のレンダラと一致する必要がある
    • 異なればターゲット画像の見た目が再現されない
    • 「Physically-based Shading (PBS)」が一般的だが、解釈が様々で皆違う
    120
    • 既存のレンダラのシェーダコードをDR上に写経する
    Vulkan AD
    微分可能
    Shader
    • シェーディングもAD上に実装すればよいだけ
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  121. 微分可能シェーディング
    • しかしDRのシェーディングは、閲覧用のレンダラと一致する必要がある
    • 異なればターゲット画像の見た目が再現されない
    • 「Physically-based Shading (PBS)」が一般的だが、解釈が様々で皆違う
    121
    • 既存のレンダラのシェーダコードをDR上に写経する
    Vulkan AD
    微分可能
    Shader
    • シェーディングもAD上に実装すればよいだけ
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ
    • コストが高いのでトランスパイラを実装する

    View Slide

  122. GLSL → Vulkan AD のトランスパイラ
    • 弊チームには独自開発されたリアルタイムレンダラがあった
    • OpenGL/GLSL実装
    • BlenderのCyclesをベースにしたマテリアル定義
    • Disney BSDFの亜種
    122
    • GLSL実装のPBSをVulkan ADの記法に変換する
    トランスパイラを実装
    • Python
    • 関数の対応テーブルがあれば可能
    Blender's Principled BSDF
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  123. GLSL → Vulkan AD のトランスパイラ
    • 元となったOpenGLレンダラとVulkanDRで同一の
    レンダリングが可能になった
    123
    OpenGL/GLSL VulkanDR
    からのトランスパイルも
    書けばできるはず
    (ライセンスに注意)
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  124. DRを用いた最適化問題
    • 実装したDR上に最適化問題を定義する
    • レンダリングパイプライン + 目的関数 (Loss)
    頂点情報
    材質
    カメラ
    出力画像 目標画像
    DR Loss
    ライト
    • 定義したDR関数を使用して最適化問題を記述する
    • レンダリングパイプラインの部品を意識する程度の粒度
    124
    GPU
    Vulkan
    計算グラフ
    自動微分
    DR
    最適化問題
    今ここ

    View Slide

  125. 最適化の具体例の紹介
    125

    View Slide

  126. マテリアル最適化の例
    • ターンテーブル上に乗せた物体をスマートフォンのカメラで撮影
    • フラッシュライト on/offの2回
    • 差分を取ることで周囲からのライトを除去
    • ジオメトリは固定
    • ColmapとOpenMVSで推定
    • マテリアルを最適化
    • Base color
    • Metallic
    • Roughness
    • Specular
    • Specular tint
    • Normal
    126

    View Slide

  127. DRでジオメトリを最適化するには
    • DRによって2Dの色情報が3Dの頂点位置にまで伝搬する
    • しかしNaiveに実装するとメッシュが崩壊する
    • 正則化が必要
    • Laplacian正則化
    • ある頂点と隣接頂点の平均位置の差分を最小化する
    • Large Steps [Nicolet+2021]
    • 初期状態のラプラシアンを保持するように形状変化を行う
    • 元論文での実装はCUDAによる疎なLinear Solverを用いているが、
    VulkanADには荷が重い
    • VulkanADでは共役勾配法を実装することで実現
    127
    https://docs.blender.org/manual/en/latest/model
    ing/modifiers/deform/laplacian_deform.html

    View Slide

  128. VulkanAD上のLarge Steps [Nicolet+ 2021]
    によるジオメトリ最適化
    正則化なし Laplacian Large Steps
    128

    View Slide

  129. VulkanAD上のLarge Steps [Nicolet+ 2021]
    によるジオメトリ最適化
    正則化なし Laplacian Large Steps
    129

    View Slide

  130. VulkanAD上のLarge Steps [Nicolet+ 2021]
    によるジオメトリ最適化
    正則化なし Laplacian Large Steps
    130

    View Slide

  131. VulkanAD上のLarge Steps [Nicolet+ 2021]
    によるジオメトリ最適化
    正則化なし Laplacian Large Steps
    131

    View Slide

  132. VulkanAD上のLarge Steps [Nicolet+ 2021]
    によるジオメトリ最適化
    正則化なし Laplacian Large Steps
    132

    View Slide

  133. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    133
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  134. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    134
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  135. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    135
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  136. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    136
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  137. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    137
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  138. トポロジーの異なる物体を扱う
    • Tetrahedraを用いた、初期形状を与えない
    形状最適化 [Munkberg+ 2022]
    • 元実装はもちろんCUDA
    • 制約のあるVulkan ADでも頑張れば実装可能
    138
    NeRFのような事がメッシュでもできる
    • Large Stepによる最適化より、安定的な最適化が可能になったが、
    初期形状を与えなければならない
    • 球から始めたらトーラスにはならない

    View Slide

  139. 後半のまとめ
    • Vulkan上にフラグメントシェーダでDR用の自動微分
    ライブラリを実現した
    • 高速
    • ベンダー非依存
    • 正確なbackward
    • VulkanDRにより、マテリアル・ジオメトリの最適化
    が高速に行えるようになった
    • Nvdiffrastの2倍から数倍
    139
    Desktop Laptop Mobile

    View Slide

  140. 雑多な話題
    現状と今後の展望
    140

    View Slide

  141. ラスタライゼーションベースの微分可能レンダラの比較
    tf_mesh_ren
    derer
    Neural 3D
    Mesh Renderer
    SoftRas/DIB-
    R/PyTorch3D
    Nvdiffast Nvdiffrast +
    Large steps
    rasterize-
    then-splat
    Dressi
    年 2018 2018 2019/2019/2020 2020 2021 2021 2022
    頂点属性 任意 任意 任意 任意 位置のみ 任意 任意
    スクリーンス
    ペース距離
    × △ 〇 〇 〇 〇
    ピクセル位置を補間で計算

    古典的レンダリ
    ングパイプライ
    ンとの整合性
    〇 × × 〇 〇 × ×
    Forward/Backw
    ard一致
    〇 × 〇 〇 〇 〇 〇
    シェーディング 必要 不要 不要 不要 不要 必要 不要
    ロバスト性 × △ 〇 △ ◎ × 〇
    シェーディング勾配 Dense Dense Dense Dense Dense Dense Dense
    シルエット勾配 None Sparse Dense Sparse Dense Dense Dense
    遮蔽面の勾配 × × 〇 ×
    (nvdiffmodeling用に半透明物体対応してい
    るが透明でない物体の裏面向けではない)
    × × 〇
    複数枚デプスバッファ × × 〇 〇 〇 〇 〇
    実装 OpenGL/CUDA CUDA CUDA OpenGL/CUDA OpenGL/CUDA OpenGL/CUDA Vulkan
    速度 ◎ △ × ◎ ◎ ◎ ◎
    最適化向け
    ネットワーク学習向け
    141

    View Slide

  142. レイトレーシングDR
    1. シェーディング勾配及び計算グラフの接続性
    • BVHによるレイと三角形の衝突判定(ラスタライズ(狭
    義)相当)は微分不能、Barycentric補間経由でBackward
    できる
    2. シルエット勾配
    • エッジ近辺を重点的にサンプリング
    • エッジサンプリング [Li+ 2018]
    • Path-Space Differentiable Rendering [Zhao+ 2020]
    • サンプリング対象を滑らかな関数に変更
    • Reparametrization [Loubet+ 2019]
    • Warping function [Bangaru+ 2020] [Bangaru+ 2020]の分類図
    142
    ラスタライゼーションDRと比較して
    • より正確にレンダリング方程式を解ける
    • 反射や屈折を含んだ最適化ができる
    • 同じ絵のクオリティを出すのに
    10倍~100倍以上遅い

    View Slide

  143. 三角形以外のプリミティブ
    • 点群
    • 体積がない点を円盤、球、SH等として距離計算
    しつつ拡がりを持たせて描く
    • 点IDでBackwardするというメッシュ同様のテク
    ニックが使えるのでハードウェアラスタライザを
    使った高速な微分可能レンダリングが可能
    • SDF
    • 陰関数であり、メッシュや点群とは異なるアプ
    ローチが必要
    • NaïveなSphere Tracingでは探索点=Backward
    される点がスパースになることが問題
    • レイトレDRと同様にreparameterizationのテク
    ニックが有効
    [Vicini+ 2022] [Bangaru+ 2022]
    DSS [Yifan+ 2019 ]
    [Zhang+ 2022]
    Pulsar [Lassner+ 2020 ]
    143

    View Slide

  144. DR界隈勢力図
    Academia Industry
    レイトレーシング
    ※DR基盤技術に着目
    ※NeRF系、CV&ML系応用は除く
    ⚫ Mitsuba 3 / 2
    ⚫ Dr. Jit / Enoki
    ⚫ Large Steps
    ⚫ And more…
    ⚫ Path-Space DR
    Prof. Wenzel Jakob
    Prof. Tzu-Mao Li
    Prof. Shuang Zhao
    ⚫ Redner
    ⚫ Reparameterization
    ⚫ Taich (not DR)
    ⚫ Neural 3D Mesh Renderer
    ⚫ SoftRas
    ⚫ nvdiffrast
    ⚫ DIB-R
    ⚫ Kaolin
    ⚫ OpenDR ⚫ Dressi
    ⚫ PyTorch3D
    ⚫ RGBXY Derivatives
    N. A.
    ⚫ Rasterize-then-splat
    ⚫ TensorFlow Graphics
    ラスタライゼーション
    144
    144

    View Slide

  145. 最近の面白かったDR論文:
    初期値が遠くても最適化できるDROT[Xing+ 2022]
    • 課題:ターゲット画像で初期値がジオメトリ的に遠
    いとスクリーンスペース勾配が発生せず最適化でき
    ない
    • Optimal Transport(Sinkhorn)で
    陽にピクセルマッチングを行う
    →ピクセルレベルで位置を合わせてから最適化する
    • これ自体の実装も既存のDRに組み込むのも容易
    145
    Hybrid:
    後半は普通の
    DRでRefine
    Basic:
    提案手法のみ

    View Slide

  146. 微分可能レンダリングの元祖は?
    • OpenDR [Loper & Black 2014]だと思われていたが
    ……
    • 実は“Model-based 3D Hand Pose Estimation
    from Monocular Video” [de la Gorce+ 2011]
    がDRの元祖らしい
    • 著者の公式リポジトリ&主張
    • https://github.com/martinResearch/DEODR
    • 2008年に実装したと書いてあるので、本当は同じ著者の” Model-
    based hand tracking with texture, shading and self-
    occlusions”[de la Gorce+ 2008]が最初?しかし大人の事情?で
    PAMI2011には引用されていない
    146

    View Slide

  147. 微分可能レンダリング以前:
    手の3Dトラッキングを例にして
    • 形状がほぼ変わらない前提でカルマンフィ
    ルタでトラッキング
    • 微分可能なガウシアンの3Dモデルをデプ
    スに対してフィッティング
    • カラーとデプスをレンダリングして画像の
    ロスを進化計算で最適化
    [Oikonomidis+ 2011]
    [Sridhar+ 2013]
    [Stenger+ 2006]
    3D形状の変形をカラー画像のロスだけで扱うのが難しかった
    が、近年では微分可能レンダリングのおかげで簡単になった
    147

    View Slide

  148. ラスタライゼーションベースの
    微分可能レンダリングの現状
    • 解決
    • 最適化やネットワークの学習に使える広範囲の勾配 ←NMRやSoftRasで解決
    • 古典的レンダリングパイプラインとの整合性 ←nvdiffrastで解決
    • Graphics Pipelineを活用したDR ← で解決
    • 未解決
    • 勾配ベース最適化に起因する局所解
    • 例:マテリアルとライトの分離
    • カラー画像“だけ”からのカメラパラメータとジオメトリの復元
    • COLMAPによるカメラパラメータの初期化、パラメトリックモデル、良い初期形状、追加の
    シルエット画像等が必要な手法が多い
    • Structure-from-Motion (SfM) + Multi-View Stereo (MVS)のビジョン系の古典的パイプライン
    に勝てない
    148

    View Slide

  149. ラスタライゼーションベースの
    微分可能レンダリングの今後の展望
    • レイトレーシングDRやNeRFと共存できるのか?
    • スピード面での優位性はしばらく続く!まだいける!
    • (古典的レンダリングとは絵が違う)
    最適化に適している微分可能レンダリング
    はまだまだ研究の余地がある
    • 微分可能シェーディング:レンダリングエンジンの移行が容易に
    • 例:Unreal Engine(UE)のシェーダのPyTorch化
    • 課題:UnityやBlenderで作ったモデルをUEに持ち込むとシェーダが違うため見た目(色)が変わる
    • 現在:アーティストのよる手作業のマテリアル等の調整が必要
    • 微分可能UEシェーダで最適化&近似すれば自動化できる
    • インタラクティブ性を活用したDRアプリケーションは未知数
    • 例:ユーザ入力に合わせてリアルタイムで最適化&プレビュー、エクスポート
    149
    SoftRas
    絵はボケているが、勾配が広い
    DROT
    絵はぐちゃぐちゃだが、初期
    値に対してロバスト

    View Slide

  150. 謝辞
    • VC関係者の皆様
    • 武原光
    • Dressi論文の著者の皆様
    • Digital Human Teamの皆様
    150

    View Slide

  151. おわり
    だが微分可能レンダリングの旅は続く……

    View Slide

  152. 参考資料

    View Slide

  153. 微分可能レンダリングに関する日本語の資料
    • “微分可能レンダリング(CVIM研究会 チュートリアル)” In
    CVIM/PRMU 2022年3月研究会.
    • https://docs.google.com/presentation/d/1nbyUBucCTFP2-
    sVLFeo2gP76L3EJTImMFXLmV7OifxI/edit?pli=1#slide=id.p
    • あのクルマのマテリアルを再現!?微分可能レンダラを用いた
    計測BRDFフィッティング (CEDEC2023)
    • https://cedec.cesa.or.jp/2023/session/detail/s6426cba8d4036
    153

    View Slide

  154. [PR] に関する資料
    • EG library:本文、supplemental material、デモ動画
    • https://diglib.eg.org/handle/10.1111/cgf14455
    • Willey(EG libraryと同じ内容の出版社版)
    • https://onlinelibrary.wiley.com/doi/10.1111/cgf.14455
    • arxiv
    • https://arxiv.org/abs/2204.01386
    • 発表の録画
    • https://www.youtube.com/watch?v=8T_BIMrzfwk
    154
    後半のVulkan実装に関する内容をより詳細に記載

    View Slide

  155. 自動微分について
    • PyTorchの自動微分の公式解説 by Preferred Networks
    • Overview of PyTorch Autograd Engine
    • https://pytorch.org/blog/overview-of-pytorch-autograd-engine/
    • How Computational Graphs are Constructed in PyTorch
    • https://pytorch.org/blog/computational-graphs-constructed-in-pytorch/
    • How Computational Graphs are Executed in PyTorch
    • https://pytorch.org/blog/how-computational-graphs-are-executed-in-
    pytorch/
    • PyTorch/LibTorchのソースコードを読むことが理解への近道
    155

    View Slide

  156. 自動微分を使えばなんでも“微分可能”?
    • PyTorchを使えば明らかに微分不能な関数でも最適化できる
    • torch.abs(): 0で微分不能
    • torch.amax(): 最大値を選ぶ、離散なので微分不能
    • 微分可能になってない、Backwardしてるだけ
    • 勾配が届く範囲は狭く、滑らかでもない
    • 滑らかで広範囲に勾配をBackwardするには“微分可能”な代替を考え
    る必要がある
    • maxに対するsoftmax
    • 正規化処理により、全ての入力と計算グラフが繋がる
    • absに対するLog-cosh Loss
    • 0でも勾配が滑らか
    0 -1
    abs(): 符号を反転して
    Backward
    max(): 最も大きい値のイ
    ンデックスにだけ
    Backward
    4

    View Slide

  157. “微分可能”な関数の階層
    とりあえずBackward可能
    滑らかand/or広範囲に
    Backward可能な代替の関数
    数学的に微分可能
    Backward不能 整数インデックスの操作など
    max(), abs()など
    Softmax(), Log-Cosh Lossなど sin(), cos()など
    NMR, SoftRas, DROT
    シェーディング勾配
    nvdiffrast

    View Slide

  158. Barycentric補間のBackward
    1. Barycentric coordinateの計算
    • 頂点位置にBackwardされる
    • Barycentricを微分不能=ハードウェアラスタライザで描いても動作は
    するが、シェーディング勾配で頂点位置が動きづらくなる
    • 線形補間によるBackwardだけだと頂点を動かすには勾配が弱い
    • 例:ボウルのような凹んだ形状をシェーディングで最適化する場合
    • 凹みはシルエットから判断できないためシェーディングに頼るしかない
    2. 線形補間
    • 任意の頂点属性にBackwardされる
    158

    View Slide

  159. 参考文献
    • ラスタライゼーション
    • Munkberg, J., Hasselgren, J., Shen, T., Gao, J., Chen, W., Evans, A., ... & Fidler, S. (2022). Extracting triangular 3d models, materials, and lighting from images. In Proceedings of the IEEE/CVF Conference on
    Computer Vision and Pattern Recognition (pp. 8280-8290).
    • Petersen, F., Goldluecke, B., Borgelt, C., & Deussen, O. (2022). Gendr: A generalized differentiable renderer. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp.
    4002-4011).
    • Takimoto, Y., Sato, H., Takehara, H., Uragaki, K., Tawara, T., Liang, X., ... & Zheng, B. (2022, May). Dressi: A Hardware‐Agnostic Differentiable Renderer with Reactive Shader Packing and Soft Rasterization.
    In Computer Graphics Forum (Vol. 41, No. 2, pp. 13-27).
    • Cole, F., Genova, K., Sud, A., Vlasic, D., & Zhang, Z. (2021). Differentiable surface rendering via non-differentiable sampling. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp.
    6088-6097).
    • Laine, S., Hellsten, J., Karras, T., Seol, Y., Lehtinen, J., & Aila, T. (2020). Modular primitives for high-performance differentiable rendering. ACM Transactions on Graphics (TOG), 39(6), 1-14.
    • Ravi, N., Reizenstein, J., Novotny, D., Gordon, T., Lo, W. Y., Johnson, J., & Gkioxari, G. (2020). Accelerating 3d deep learning with pytorch3d. arXiv preprint arXiv:2007.08501.
    • Zhu, W., Wu, H., Chen, Z., Vesdapunt, N., & Wang, B. (2020). Reda: reinforced differentiable attribute for 3d face reconstruction. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern
    Recognition (pp. 4958-4967).
    • Liu, S., Li, T., Chen, W., & Li, H. (2019). Soft rasterizer: A differentiable renderer for image-based 3d reasoning. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 7708-7717).
    • Kato, H., Ushiku, Y., & Harada, T. (2018). Neural 3d mesh renderer. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 3907-3916).
    • Genova, K., Cole, F., Maschinot, A., Sarna, A., Vlasic, D., & Freeman, W. T. (2018). Unsupervised training for 3d morphable model regression. In Proceedings of the IEEE Conference on Computer Vision and
    Pattern Recognition (pp. 8377-8386).
    • Loper, M. M., & Black, M. J. (2014). OpenDR: An approximate differentiable renderer. In Computer Vision–ECCV 2014: 13th European Conference, Zurich, Switzerland, September 6-12, 2014, Proceedings,
    Part VII 13 (pp. 154-169). Springer International Publishing.
    • de La Gorce, M., Fleet, D. J., & Paragios, N. (2011). Model-based 3d hand pose estimation from monocular video. IEEE transactions on pattern analysis and machine intelligence, 33(9), 1793-1805.
    • de La Gorce, M., Paragios, N., & Fleet, D. J. (2008, June). Model-based hand tracking with texture, shading and self-occlusions. In 2008 IEEE Conference on Computer Vision and Pattern Recognition (pp. 1-8).
    IEEE.
    • レイトレ:Edge sampling
    • Li, T. M., Aittala, M., Durand, F., & Lehtinen, J. (2018). Differentiable monte carlo ray tracing through edge sampling. ACM Transactions on Graphics (TOG), 37(6), 1-11.
    • レイトレ:Path-space
    • Zhang, C., Miller, B., Yan, K., Gkioulekas, I., & Zhao, S. (2020). Path-space differentiable rendering. ACM transactions on graphics, 39(4).
    • レイトレ:Area sampling
    • Bangaru, S. P., Li, T. M., & Durand, F. (2020). Unbiased warped-area sampling for differentiable rendering. ACM Transactions on Graphics (TOG), 39(6), 1-18.
    • Loubet, G., Holzschuch, N., & Jakob, W. (2019). Reparameterizing discontinuous integrands for differentiable rendering. ACM Transactions on Graphics (TOG), 38(6), 1-14.
    159

    View Slide

  160. 参考文献
    • SDF
    • Bangaru, S. P., Gharbi, M., Luan, F., Li, T. M., Sunkavalli, K., Hasan, M., ... & Durand, F. (2022, November). Differentiable rendering of neural sdfs through reparameterization. In SIGGRAPH Asia 2022 Conference Papers (pp. 1-9).
    • Vicini, D., Speierer, S., & Jakob, W. (2022). Differentiable signed distance function rendering. ACM Transactions on Graphics (TOG), 41(4), 1-18.
    • 点群
    • Zhang, Q., Baek, S. H., Rusinkiewicz, S., & Heide, F. (2022, November). Differentiable point-based radiance fields for efficient view synthesis. In SIGGRAPH Asia 2022 Conference Papers (pp. 1-12).Lassner, C., & Zollhofer, M. (2021). Pulsar: Efficient sphere-based neural
    rendering. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 1440-1449).
    • Lassner, C., & Zollhofer, M. (2021). Pulsar: Efficient sphere-based neural rendering. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 1440-1449).
    • Yifan, W., Serena, F., Wu, S., Öztireli, C., & Sorkine-Hornung, O. (2019). Differentiable surface splatting for point-based geometry processing. ACM Transactions on Graphics (TOG), 38(6), 1-14.
    • Pfister, H., Zwicker, M., Van Baar, J., & Gross, M. (2000, July). Surfels: Surface elements as rendering primitives. In Proceedings of the 27th annual conference on Computer graphics and interactive techniques (pp. 335-342).
    • NeRF & ボリューム
    • Mildenhall, B., Srinivasan, P.P., Tancik, M., Barron, J.T., Ramamoorthi, R., Ng, R. (2020). NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. In: Vedaldi, A., Bischof, H., Brox, T., Frahm, JM. (eds) Computer Vision – ECCV 2020. ECCV 2020. Lecture Notes in
    Computer Science(), vol 12346. Springer, Cham. https://doi.org/10.1007/978-3-030-58452-8_24
    • 汎用的テクニック
    • Xing, J., Luan, F., Yan, L. Q., Hu, X., Qian, H., & Xu, K. (2022). Differentiable Rendering using RGBXY Derivatives and Optimal Transport. ACM Transactions on Graphics (TOG), 41(6), 1-13.
    • Nicolet, B., Jacobson, A., & Jakob, W. (2021). Large steps in inverse rendering of geometry. ACM Transactions on Graphics (TOG), 40(6), 1-13.
    • 画像生成ネットワーク
    • Nguyen-Phuoc, T. H., Li, C., Balaban, S., & Yang, Y. (2018). Rendernet: A deep convolutional network for differentiable rendering from 3d shapes. Advances in neural information processing systems, 31.
    • Kips, R., Jiang, R., Ba, S., Duke, B., Perrot, M., Gori, P., & Bloch, I. (2022, May). Real‐time Virtual‐Try‐On from a Single Example Image through Deep Inverse Graphics and Learned Differentiable Renderers. In Computer Graphics Forum (Vol. 41, No. 2, pp. 29-40).
    • DR以前
    • Sridhar, S., Oulasvirta, A., & Theobalt, C. (2013). Interactive markerless articulated hand motion tracking using RGB and depth data. In Proceedings of the IEEE international conference on computer vision (pp. 2456-2463).
    • Oikonomidis, I., Kyriazis, N., & Argyros, A. A. (2011, August). Efficient model-based 3D tracking of hand articulations using Kinect. In BmVC (Vol. 1, No. 2, p. 3).
    • Stenger, B., Thayananthan, A., Torr, P. H., & Cipolla, R. (2006). Model-based hand tracking using a hierarchical bayesian filter. IEEE transactions on pattern analysis and machine intelligence, 28(9), 1372-1384.
    • アプリケーション
    • Lin, C. H., Gao, J., Tang, L., Takikawa, T., Zeng, X., Huang, X., ... & Lin, T. Y. (2023). Magic3d: High-resolution text-to-3d content creation. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 300-309).
    • https://github.com/ascust/3DMM-Fitting-Pytorch.git
    • Kanazawa, A., Tulsiani, S., Efros, A. A., & Malik, J. (2018). Learning category-specific mesh reconstruction from image collections. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 371-386)..
    160

    View Slide