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
GoでCコンパイラを作った話
repunit
0
110
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
160
知らん間に、回ってる
ming_ayami
0
730
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
3.9k
ソニー銀行におけるビジネスアジリティ向上のためのクラウドシフト戦略
srenext
0
830
企業でAWS Organizationsを動かすための組織設計の考え方
nrinetcom
PRO
1
110
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
240
ZOZOTOWNの進化と信頼性を両立する負荷試験
zozotech
PRO
2
250
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
13
6.6k
Webアプリ認証の全体像 / The Big Picture of Web App Authentication
kitano_yuichi
0
150
AI、CDK と協働する Full TypeScript アプリケーション開発 / Full TypeScript Application with AI and CDK
geekplus_tech
2
400
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
2
810
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Docker and Python
trallard
47
4k
The World Runs on Bad Software
bkeepers
PRO
72
12k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
340
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
500
The Cult of Friendly URLs
andyhume
79
6.9k
Navigating Weather and Climate Data
rabernat
0
370
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
420
Building an army of robots
kneath
306
46k
Designing for Timeless Needs
cassininazir
1
370
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