Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
画像処理から始めるコンピュートシェーダ / Introduction to Image Pro...
Search
sotanmochi
September 23, 2019
Technology
2.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
画像処理から始めるコンピュートシェーダ / Introduction to Image Processing using Compute Shader
UniteEve2のLT登壇資料
sotanmochi
September 23, 2019
More Decks by sotanmochi
See All by sotanmochi
URP/HDRPを使ったVRM対応アプリの開発方法 / VRM Importer Extension
sotanmochi
0
1.8k
Diminished Reality 入門 / Introduction to Diminished Reality
sotanmochi
2
9.5k
Unityでテクスチャにお絵描きするための線分描画アルゴリズムの話 / Line drawing algorithm using fragment shader
sotanmochi
2
4k
MagicOnionでマルチプレイゲームを作ってみる / Introduction to developing multiplayer games using MagicOnion
sotanmochi
1
2.6k
SmartRig Bipedを使ってみよう / Introduction to SmartRig Biped
sotanmochi
0
3.5k
VRMを使ったAR/MR撮影ツールを試作開発してみた話 / Prototype of Mobile Mixed Capture
sotanmochi
0
1.8k
リアルとバーチャルの融合によって越えられない壁を壊す / TechCafe vol.8 LT
sotanmochi
0
300
ユニティちゃんと鬼ごっこができるMRゲームと戦術位置解析システム / Mixed reality game and tactical position analysis
sotanmochi
0
730
Research modeで取得した深度(Depth)データを可視化する / Depth data visualization for Hololens RS4 Research mode
sotanmochi
0
210
Other Decks in Technology
See All in Technology
関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript
kaminashi
2
130
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
670
大量データに対しても、生成AIを用いてリーズナブルにデータ加工をしたい!Databricksのai_queryについて調べてみた
kamoshika
1
220
企業でAWS Organizationsを動かすための組織設計の考え方
nrinetcom
PRO
1
110
Kaggleで成長するために意識したこと
prgckwb
2
420
カードゲーム作りが教えてくれた プロダクトオーナーシップ
moritamasami
0
110
GoでCコンパイラを作った話
repunit
0
110
Making sense of Google’s agentic dev tools
glaforge
1
280
公式ドキュメントの歩き方etc
coco_se
1
120
DatabricksにおけるMCPソリューション
taka_aki
1
280
Amazon EVS で VCF 9.0 / 9.1 のサポート開始まとめ
mtoyoda
0
310
SRE本の知られざる名シーン / The Hidden Gems of Google SRE Book
nari_ex
1
420
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
How to Talk to Developers About Accessibility
jct
2
400
Writing Fast Ruby
sferik
630
63k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
280
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Building Applications with DynamoDB
mza
96
7.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
Transcript
2019/09/23 Soichiro Sugimoto sotan (@sotanmochi) 画像処理から始めるコンピュートシェーダ
2 自己紹介 杉本 宗一郎(Soichiro Sugimoto) sotan (@sotanmochi) xR系Unityエンジニア xRに関する応用研究・プロトタイプ開発 ・DR(Diminished Reality:隠消現実感)の研究
・VR/ARのアプリケーション開発
コンピュートシェーダで画像処理を実装した例 カメラ画像をイラスト風に変換するフィルター(試作開発中) 3 Before After 動画1:https://youtu.be/gxmsS83Uens 動画2:https://youtu.be/5ffZ56EAlXA
コンピュートシェーダ GPUをグラフィックス描画以外の汎用的な目的で活用できるようにする仕組み (GPGPUのための仕組み) 大量のデータを並列処理する汎用的なプロセッサとしてGPUを活用できる 通常のレンダリングパイプラインと切り離された独立したシェーダ (ラスタライザなどのグラフィックス処理が走らない) HDRPのポストエフェクトやVisual Effect Graphのパーティクルに使われている 4
コンピュートシェーダで画像処理を実装する ピクセル単位の並列化によって画像処理を高速化 5 逐次処理のイメージ 並列処理のイメージ
コンピュートシェーダで画像処理を実装する 基本的な考え方 ・全体の処理の流れはCPU側で実装 ・ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 ・画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 6
実装例のコードを見ながら 基本的な考え方やポイントを確認していきます (※アルゴリズムの中身は気にしない) 7
コンピュートシェーダで画像処理を実装する カメラ画像をイラスト風に変換するフィルター処理の実装例 8 バイラテラルフィルタ エッジ検出 乗算(BF and エッジ) BF+エッジ+コントラスト調整 バイラテラルフィルタ
エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
コンピュートシェーダで画像処理を実装する 全体の処理の流れはCPU側(C#スクリプト)で実装 9 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) フィルタ処理を順番に呼び出している
コンピュートシェーダで画像処理を実装する 全体の処理の流れはCPU側(C#スクリプト)で実装 10 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) フィルタ処理を順番に呼び出している
処理の複雑さの都合により 詳細なコードは 実際の処理と逆順で見ていきます
コンピュートシェーダで画像処理を実装する 全体の処理の流れはCPU側(C#スクリプト)で実装 11 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) データをセットした後、コンピュートシェーダ(指定したカーネル)を実行する
コンピュートシェーダで画像処理を実装する ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 12 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) 1つのグループにつき16x16=256並列で
実行される(並列数の上限はデバイスによる) 1つのピクセルに対する処理
コンピュートシェーダの並列処理のモデル 画像出典: Direct Compute – Bring GPU Computing to the
Mainstream https://www.nvidia.com/content/GTC/documents/1015_GTC09.pdf 13
コンピュートシェーダの並列処理のモデル 画像出典: Direct Compute – Bring GPU Computing to the
Mainstream https://www.nvidia.com/content/GTC/documents/1015_GTC09.pdf 14 1つのグループにつき THREADS_X × THREADS_Y の並列数で 実行される(並列数の上限はデバイスによる)
コンピュートシェーダで画像処理を実装する 全体の処理の流れはCPU側(C#スクリプト)で実装 15 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) Thread
Groups X = 80 Thread Groups Y = 45 指定したスレッドグループ数でコンピュートシェーダ(カーネル)を実行する 1つのグループにつき16x16=256並列で実行される時 ・X方向のスレッド数:16 ・Y方向のスレッド数:16 1280x720の解像度の画像全体を処理するために必要な グループ数 ・X方向:1280 / 16 = 80 ・Y方向: 720 / 16 = 45
コンピュートシェーダで画像処理を実装する ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 16 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) 全てのスレッドの中から
実行中のスレッドを識別できるID (画像のピクセル位置に相当) 1つのピクセルに対する処理
コンピュートシェーダで画像処理を実装する 画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 (グローバル同期(異なるスレッドグループ間の同期)が必要なため) 17 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
エッジ検出処理では、グレースケールに変換後、フィルタ処理を実行している
コンピュートシェーダで画像処理を実装する 画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 (グローバル同期(異なるスレッドグループ間の同期)が必要なため) 18 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
BFの反復はCPU側で制御 データをセットして実行 × N回
コンピュートシェーダで画像処理を実装する カメラ画像をイラスト風に変換するフィルター処理の実装例 19 バイラテラルフィルタ エッジ検出 乗算(BF and エッジ) BF+エッジ+コントラスト調整 バイラテラルフィルタ
エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
まとめ コンピュートシェーダはGPUを汎用的な並列処理に活用できる仕組み ピクセル単位の並列化によって画像処理を高速化できる 基本的な考え方 ・全体の処理の流れはCPU側で実装 ・ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 ・画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 20
ありがとうございました
Appendix
コンピュートシェーダを始めるための参考資料 Unity Graphics Programming vol.1 第2章 ComputeShader入門 https://indievisuallab.stores.jp/items/59edf11ac8f22c0152002588 Hello, DirectCompute
https://www.slideshare.net/dasyprocta/hello-direct-compute Direct Compute – Bring GPU Computing to the Mainstream https://www.nvidia.com/content/GTC/documents/1015_GTC09.pdf Compute Shader Magic ~あなたの描画エンジンでコンピュートシェーダを活用するアイデア(CEDEC 2013) https://cedil.cesa.or.jp/cedil_sessions/view/1002 23
コンピュートシェーダで画像処理を実装? なぜコンピュートシェーダを使う? 画像処理ならピクセルシェーダ(フラグメントシェーダ)で実装できるのでは? 24
コンピュートシェーダの利点 コンピュートシェーダを使った演算にはピクセルシェーダに比べて 以下のような利点がある ・出力先リソースの任意の位置に書き込み可能 ・データ共有やスレッド間同期のメカニズム ・指定した数のスレッドを明示的に起動でき、パフォーマンスを最適化できる ・描画パイプラインと無関係なので、コードの保守が簡単 (参考:「DirectX11 3Dプログラミング [改訂版]
第2部21章(p.332)」) 25
コンピュートシェーダで画像処理を実装する 画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 (グローバル同期(異なるスレッドグループ間の同期)が必要なため) 26 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
エッジ検出処理では、グレースケールに変換後、フィルタ処理を実行している
コンピュートシェーダで画像処理を実装する ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 27 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ) 周囲のピクセル値を使って計算
コンピュートシェーダで画像処理を実装する 画像全体に対する処理の終了を待つ箇所はカーネルを分けて実装 (グローバル同期(異なるスレッドグループ間の同期)が必要なため) 28 バイラテラルフィルタ エッジ検出(ソーベルフィルタ) 乗算(BF and エッジ) コントラスト調整(トーンカーブ)
BFの反復はCPU側で制御 データをセットして実行 × N回
コンピュートシェーダで画像処理を実装する ピクセルごとの処理(データを並列処理する部分)はGPU側で実装 29 周囲のピクセル値を使って計算
END