Kekeの日記

エンジニア、読書なんでも

GPUのイメージを掴む

f:id:bobchan1915:20180906221216p:plain

0. はじめに

本記事では普段使っているGPUImage2をよりよく知るためにGPUの挙動を少し掴められればいいなと思って書きました。

1. GPUImage2とは

GPUImage2とは

Swiftで書かれたGPUアクセレーションを使って画像や動画に対して処理を行うオープンソースフレームワーク

のことです。

また、GPUImageの第二世代に当たります。これはiOS、macOS、およびswiftをサポートする環境下で使うことができます。

開発元はKhronosです。

jp.khronos.org

1.1 Githubリポジトリ情報

以下がGithubリポジトリになります。

github.com

また、2018/09/06付のスター数、フォーク数などは以下の通りです。

  • fork数: 413
  • star数: 3860
  • contributor: 17

1.2 ライセンス

GPUImage2BSD-3-clauseライセンスで公開されています。

せっかく数日前にOSSライセンスのエントリを書いたので見てみようと思います。

1.3 目的

GPUImageの目的は

  • 動画や画像の機械学習用途
  • リアルタイムな動画処理

をすることです。どちらも一般的には処理が重くCPUだけでは対応できないところがありますが、GPUを使うことによって何百倍を高速化することができ、特にモバイルアプリでは注目に値できるでしょう。

1.4 必要条件

以下の条件が必要です。

  • Swift 3
  • MacかiOS上でXcode 8.0
  • iOS 8.0以上
  • OSX 10.9 以上
  • Linux: Swiftコードやコンパイルできる環境なら大丈夫

1.5 GPUImageに使われているOpen GLの基礎

1.5.1 Open GLとは

OpenGLとはコンピュータークラフィック用のAPIである。これによって開発者は直接GPU操作をしなくても簡単にGPUを用いた画像処理などが行えます。

いろんな2次元、3次元グラフィックをサポートしていて、ウェブでは広く知られているWebGLのパイオニアです。

詳細を知りたい人は以下のサイトをご覧ください。

OpenGLプログラミング - Wikibooks

1.5.2 Open GL(ES)とは

ESは組み込みシステム(Embedded System)の略で、Open GLに組み込まれているものです。

Open GL(ES)とは、主に携帯電話などの組み込みシステムで使用されている3次元コンピュータグラフィックス用APIです。

1.6 フレームワークのアーキテクチャ

すべての画像や動画は以下のように、三角で構成されるメッシュでできている。っといっても過言ではありません。

https://i.ytimg.com/vi/XUzOZiZOiGI/maxresdefault.jpg

https://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=2ahUKEwilppCOiqbdAhUJOrwKHYUNB7wQjhx6BAgBEAM&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DXUzOZiZOiGI&psig=AOvVaw03gx48Dcgq4fgMrh3SVu7m&ust=1536313010685403

このような画像を処理するのは以下のようなプロセスパイプラインを使います。

f:id:bobchan1915:20180906183921p:plain

An intro to modern OpenGL. Chapter 1: The Graphics Pipeline

以下に細かい用語をまとめておきます。

Vertex

頂点。

Vertex array

Vertexが格納されている配列。

Triangle Assenmbly

Vertexを結んでできる三角形。

Fragment Shadder

テキスチャだったり、照明の処理をかける。

Test and Blending

すでに書き込まれている後ろにあるfragmentを削除する。

Framebugffers

出力。

パイプラインの入力はカメラ、ファイルなどimageやvideoです。そして、いくつもの変換処理をするimageConsumerを経て、出力のスクリーン、画像ファイル、生データへ出力されます。

アトミックな変換処理を繰り返すことによって、好きな変換処理をすることができます。

GPUを使った変換処理はOpen GE(ES) 頂点シェダーとフラグメントシェダーを使います。

2. vs Vulkan

グラフィックハードウェアの低いレベルの制御を目的としていて、AppleのMetalを競合しています

Vulkanとは、同じくKhorosが開発しているクラスプラットフォームなグラフィックスAPIである。

特に**Open GLへはハードウェア設計への乖離があり、Open GLやOpen GL(ES)はハードウェアを高度に抽象化されていて、利便性が高いものの性能要求の厳しいソフトウェアの開発に利用する場合はオーバーヘッドが大きかったのである。

Vulkan (API) - Wikipedia

特にOpen GL 4.6からはVulkanと互換性があるみたいです。

参考文献

カーネギーメロン大学のGPUに関する講義資料

カーネギーメロン大学はコンピュータサイエンスで世界トップレベルを誇る。

特にGPUImageについてフォーカスされているが、CUDAやOpenCLなども触れている。 特に大きな変化はないが、GPUImage2ではなくてGPUImageについて書かれていることに注意

http://16623.courses.cs.cmu.edu/slides/Lecture_4.pdf

Open GLとVulkanについてのニュース

www.4gamer.net