ナレッジボックス

Pocket


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メソッド内で初期化しています。

 

今回は、「OpenGL ES 2.0」を利用するため、「kEAGLRenderingAPIOpenGLES2」の定数を設定しています。

「OpenGL ES」のバージョンによって、この定数は変わります。

OpenGL ESのバージョン 定数
1.x kEAGLRenderingAPIOpenGLES1
2.x kEAGLRenderingAPIOpenGLES2
3.x kEAGLRenderingAPIOpenGLES3

描画スレッドの管理

EAGLContextのリファレンスにも記載されていますが、OpenGLコマンドを実行するには、現在のレンダリングコンテキストが必要になります。

現在のレンダリングコンテキストにEAGLContextを設定するには、EAGLContextの「setCurrentContext」を利用します。

 

※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で波紋を作る#1 前提知識1

OpenGL ES2.0で波紋を作る#2 前提知識2

OpenGL ES2.0で波紋を作る#3 プロジェクト作成

OpenGL ES2.0で波紋を作る#4 OpenGL ES を組み込むベースを作成

 


Pocket

お問合せ

開発に関するご相談/各種お問合せは下記まで。

TEL.06-4806-3470 月曜~金曜(祝日を除く)10:00~18:00
contact-dev@kronos-jp.net

技術情報

  • ナレッジボックス
グリーンハンド
STA-LOG
クロノスラボ
採用