OpenGL ES 2.0で波紋を作る#4 OpenGL ES を組み込むベースを作成
この章では、作成したrepercussionsプロジェクトの理解と波紋を作るためのrepercussionsプロジェクトの変更方法について解説します。
ポイント
・repercussionsプロジェクトの理解
・プロジェクトの変更方法
repercussionsプロジェクトの理解
repercussionsプロジェクトは、既に「OpenGL ES」が取り込まれたプロジェクトです。
各メソッドで「OpenGL ES」がどのように処理しているかを確認しましょう。
repercussionsプロジェクト
プロジェクトを新規作成すると、以下のクラスが自動生成されます。
repercussions
|_AppDelegate.h
|_AppDelegate.m
|_Shader.fsh
|_Shader.vsh
|_GameViewController.h
|_GameViewController.m
|_Main.storyboard
|_Images.xcassets
|_LaunchScreen.xib
|_Supporting Files
| |_Info.plist
| |_main.m
|_repercussionsTests
|_Products
|_repercussions.app
|_repercussionsTests.app
このプロジェクトでは、GameViewControllerクラスが描画処理のメインクラスになっています。このクラスを理解すれば、OpenGLの流れが更に理解できると思います。
では、GameViewControllerクラスの各メソッドにどのような処理を記載しているのか解説します。
・GLKViewController main methods
No. | メソッド | 内容 |
---|---|---|
1 | (void)viewDidLoad | UIViewControllerのライフサイクルにおいて、initの後に呼ばれるメソッドです。 アプリ起動後、Viewが初めて呼び出される際に1回だけ呼ばれます。このタイミングで、シェーダの初期化を行います |
2 | (void)dealloc | メモリ解放時に呼ばれるメソッドです。 ARC(Automatic Reference Counting)にて、コンパイラが適切な場所に、このdeallocメソッドを挿入します。 今回は、OpenGLで利用しているリソースを開放します。 |
3 | (void)didReceiveMemoryWarning | メモリ不足が発生した際に呼ばれるメソッドです。 メモリ不足が発生した場合、OpenGLで利用しているリソースを開放します。 |
4 | (BOOL)prefersStatusBarHidden | ステータスバーを非表示にするメソッドです。 戻り値をtrueにすることで、ステータスバーが非表示になります。 |
5 | (void)setupGL | シェーダを初期化するメソッドです。 |
6 | (void)tearDownGL | シェーダをメモリから開放するメソッドです。 |
・GLKView and GLKViewController delegate methods
No. | メソッド | 内容 |
---|---|---|
7 | (void)update | 処理を更新するメソッドです。 描画しませんが、描画するための計算などを事前に行います。 |
8 | (void)glkView:(GLKView *)view drawInRect:(CGRect)rect | Viewを描画するメソッドです。 シェーダで記載した内容が描画されます。 |
・GLKViewController main methods
No. | メソッド | 内容 |
---|---|---|
9 | (void)viewDidLoad | シェーダをロードするためのメソッドです。 内部では、Shader.vsh、Shader.fshをロードします。 |
10 | (void)dealloc | ロードしたシェーダをコンパイルするためのメソッドです。 |
11 | (void)didReceiveMemoryWarning | プログラマブルシェーダにリンクするためのメソッドです。 |
12 | (BOOL)prefersStatusBarHidden | OpenGLが実行可能かどうかをチェックするためのメソッドです。 |
□ OpenGL ESの初期化
「OpenGL ES」を利用するには、EAGLContextが必要になります。
EAGLContextは、Apple公式サイトのリファレンスに以下のように記載されています。(※1)
An EAGLContext object manages an OpenGL ES rendering context—the state information, commands, and resources needed to draw using OpenGL ES. To execute OpenGL ES commands, you need a current rendering context.
「OpenGL ES Framework Referenceより抜粋」
EAGLContextオブジェクトは、OpenGL ESのレンダリングコンテキスト(OpenGL ESを使用して描画するのに必要なリソースやコマンド、状態情報)を管理します。OpenGL ESコマンドを実行するには、現在のレンダリングコンテキストが必要になります。
つまり、EAGLContextが描画に必要な情報を管理しているクラスであり、描画スレッドに管理されたEAGLContextがなければ、OpenGLコマンドは実行することができないことになります。
このEAGLContextクラスのポイントは、オブジェクトの初期化と描画スレッドの管理です。
EAGLContext初期化
EAGLContextは、No.1のviewDidLoadメソッド内で初期化しています。
1 |
@property (strong, nonatomic) EAGLContext *context; |
1 |
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; |
今回は、「OpenGL ES 2.0」を利用するため、「kEAGLRenderingAPIOpenGLES2」の定数を設定しています。
「OpenGL ES」のバージョンによって、この定数は変わります。
OpenGL ESのバージョン | 定数 |
---|---|
1.x | kEAGLRenderingAPIOpenGLES1 |
2.x | kEAGLRenderingAPIOpenGLES2 |
3.x | kEAGLRenderingAPIOpenGLES3 |
描画スレッドの管理
EAGLContextのリファレンスにも記載されていますが、OpenGLコマンドを実行するには、現在のレンダリングコンテキストが必要になります。
現在のレンダリングコンテキストにEAGLContextを設定するには、EAGLContextの「setCurrentContext」を利用します。
1 |
[EAGLContext setCurrentContext:self.context] |
※OpenGLコマンドを実行する前に現在のレンダリングコンテキストに設定しますが、No.7のupdate、No.8のglkViewメソッドでは、現在のレンダリングコンテキストが設定されている状態で実行されるため、設定する必要はありません。
□ シェーダの初期化、破棄、更新、描画
EAGLContextを初期化した後は、シェーダの初期化と破棄、そして、描画処理の更新と描画を行います。
ここでは、OpenGLがどのように利用されているかがポイントになるため、各メソッド内に記載された処理については詳細な説明を省きます。
ただし、前回説明した#1「基礎知識1」(シェーダの初期化)、#2「基礎知識2」(シェーダの効率的な描画)の内容と同じような内容になっています。そちらと合わせて確認してください。
シェーダの初期化
シェーダの初期化は、No.5のsetupGLメソッド内で実施します。
setupGLメソッドは、以下を処理しています。
・シェーダオブジェクトの作成(ロード)とコンパイル
・プログラマブルシェーダへのリンク
・頂点情報設定
・バッファの作成とアップロード
・バッファのバインド、アンバインド
・頂点情報の利用箇所指定
シェーダの破棄
シェーダの破棄は、No.6のtearDownGLメソッド内で実施します。
tearDownGLメソッドは、以下を処理しています。
・バッファの削除
・プログラマブルのリンク削除
更新
更新は、No.7のupdateメソッド内で実施します。
updateメソッドは、以下を処理しています。
・座標再計算(四角形、カメラ)
描画
描画は、No.8のglkViewメソッド内で実施します。
glkViewメソッドは、以下を処理しています。
・カラー設定
・バッファのバインド
・座標アップロード
・描画
repercussionsプロジェクトの変更方法
repercussionsプロジェクトには、12メソッドが定義されていますが、そのうち4メソッドを変更することで、今回のテーマである波紋のメイン処理を作成することができます。
その4メソッドは、シェーダの初期化、破棄、更新、描画で説明したメソッドになります。
それ以外のメソッドは、ほとんどがそのまま利用できます。
No. | メソッド | 内容 |
---|---|---|
5 | (void)setupGL | シェーダを初期化するメソッドです。 |
6 | (void)tearDownGL | シェーダをメモリから開放するメソッドです。 |
7 | (void)update | 処理を更新するメソッドです。 描画しませんが、描画するための計算などを事前に行います。 |
8 | (void)glkView:(GLKView *)view drawInRect:(CGRect)rect | Viewを描画するメソッドです。 シェーダで記載した内容が描画されます。 |
次回は、いよいよ波紋作成です。
波紋を作成するための基礎である板ポリゴンを作成します。
参考
※1・・・「EAGLContext」については、OpenGL ES Framework Reference の EAGLContext を参照してください。
バックナンバー
OpenGL ES2.0で波紋を作る#4 OpenGL ES を組み込むベースを作成