タイトルCocoaはやっぱり!出張版》8. OpenGLを使う(1)カテゴリーグラフィックス, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2002/2/19 14:0:28作成者新居雅行
   この記事のPDFファイル(1,180KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline_2002.02_OpenGL.pdf

   今回の記事のソース一式が含まれるプロジェクトは以下のアドレスです。
   画像等と同じく、ダウンロードにはパスワード等は設定していません。
   http://mdonline.jp/figs/02/022/SampleCode.sit
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
■ 今回のテーマ
今回は、いつものサンプルコードの解説を一旦お休みして、CocoaアプリケーションからOpenGLを利用する方法をテーマとして取り上げます。OpenGLというと、3Dグラフィックス用という印象が強くて、一般のプログラマーには縁遠い感じもしますが、最近では様々なビジュアルエフェクトのためにOpenGLを使用するというケースも増えてきています。

例えば、iPhotoのスライドショーや、Mac OS Xに付属のBeachやCosmosなどのスライドショーを行うスクリーンセーバーでは、2つの画像をクロスフェードする ( 2つの画像の片方が消えながら、もう一方の画像が現れてくる ) ビジュアルエフェクトが使われています。あれらはOpenGLの機能を使って実現しています。iTunesに標準搭載のビジュアルエフェクトもOpenGLによって実現されています。このように、3Dグラフィックと関係のないソフトウェアでもOpenGLが使われるようになってきています。

そこで、本格的な3Dグラフィックの実現のためのOpenGLの利用ではなく、ビジュアルエフェクトのためのOpenGLの利用という観点からの説明を行っていきます。もちろん、3DグラフィックアプリケーションをCocoaで作成するという方にも、第一歩を踏み出すのには役に立つのではないかと思います。

◎ 推奨環境
この解説は、以下の環境を前提にしていますので、ご確認ください。

  • Mac OS X 10.1.2以降
  • Project Builder 1.1.1 ( December 2001 Developer Tools ) 以降
  • Interface Builder 2.2 ( December 2001 Developer Tools ) 以降

なお、OpenGLの実行結果は、搭載しているグラフィックスアクセラレーターカードによって変わることがありますのが、ご了承ください。こちらで確認しているのは、PowerBook G4 / 500とiMac DVです。

■ CocoaとOpenGLとの関係
まずは、CocoaとOpenGLの関係から見ていきます。CocoaアプリケーションからOpenGLを使うための主要なクラスは、NSOpenGLViewとNSOpenGLContextの2つです。NSOpenGLViewは、NSViewのサブクラスになっていまして、画面へのグラフィックの表示やイベント処理などを行います。NSOpenGLContextは、OpenGLのエンジンが使用するフレームバッファや描画の属性等を記憶するためのコンテキストを扱うためのクラスです。NSOpenGLViewは、1つのNSOpenGLContextを持っています。

そもそも、Cocoa ( もしくはMac OS X ) とOpenGLは、全く独立に開発されたものですので、CocoaとOpenGLはあまり密な関係にはありません。OpenGLには、OpenGL自身が管理しているコンテキストに描画を行ってもらい、その結果を引き取って、Cocoaの環境に合わせて画面に表示するというようなイメージになります。CocoaとOpenGLの間の仲介役としてNSOpenGLViewやNSOpenGLContextが存在しているわけです。

◇CocoaとOpenGLの関係
 

描画を行う場合は、CocoaアプリケーションからOpenGLの関数を直接呼び出すことになります。そうすると、カレントのOpenGLのコンテキストに対して描画が行われます。OpenGLの関数を呼ぶことになりますので、CocoaのプログラミングとはいえOpenGLの知識が必要になります。ただし、この記事の目的はOpenGLの解説ではありませんので、OpenGLについては簡単な説明にとどめさせて頂きます。

実のところ、私自身もこの記事を書くために初めてOpenGLを勉強しましたので、まだ使い方がこなれていないところがあるかもしれませんが、間違いのご指摘などありましたらお願いいたします。Web上で私がOpenGL入門のために主に参考にしたのは、以下のOpenGLプログラミングコースというサイトです。サンプルを交えた丁寧な解説でPDFによる400ページを超えるドキュメントがありますので、入門にはよいのではないかと思います。こちらと合わせて読んでいただけると、より理解が深まると思います。

◇OpenGLプログラミングコース
 http://www.nk-exa.co.jp/mmtech/OpenGLEdu/

■ 簡単なプログラムを作る
では、簡単なプログラムを作ってCocoaアプリケーションからOpenGLを呼び出してみましょう。まず、Project BuilderでプロジェクトをCocoa Applicationとして作成します。OpenGLの関数を使うためにはOpenGL.frameworkというフレームワークが必要ですので、「 プロジェクト → フレームワークを追加... 」メニューでプロジェクトに追加します。

◇OpenGL.frameworkの追加
 

ちょっと補足:今回は使用しませんが、GLUT ( OpenGL Utility Toolkit ) という、より簡単にOpenGLを扱うためのフレームワークも用意されています。GLUTを使う場合は、GLUT.frameworkもリンクしてください。ちなみに、GLUTのサンプルは、以下のディレクトリに沢山入っていますので参考になるでしょう。

 /Developer/Examples/GLUTExamples/

次に、Resourcesの中のMainMenu.nibをダブルクリックしてInterface Builderを起動します。Cocoa-GraphicsViewsの中にあるOpenGLのロゴが書かれているものが、NSOpenGLViewです。これをウィンドウの中にドロップして配置しますと、NSOpenGLViewが使えるようになります。

◇Cocoa-GraphicsViewsのNSOpenGLView
 

自前のビューを作成する場合には、NSViewのサブクラスを作成して、配置したCustom Viewにそのクラスを割り当てて、初期化メソッドのinitWithFrame : や描画メソッドのdrawRect : を書きます。自前のOpenGLのビューを作成する場合も、NSOpenGLViewのサブクラスを作って...という流れは変わりません。

ウィンドウに配置するのは、Cocoa-GraphicsViewsのNSOpenGLViewでもよいですし、今までどおり、Cocoa-ContainersのCustom Viewでも構いませんが、今回は、Custom Viewを使用します。

◇Cocoa-ContainersのCustom View
 

NSOpenGLViewを使わないのは、NSOpenGLViewを配置した場合は、initWithFrame : メソッドが呼ばれないためです。initWithFrame : は、Custom Viewを配置した場合のみ呼ばれるようです。このことについては、Interface BuilderのFAQの「 Why isn’t my initWithFrame : method called? ( なぜ私のinitWithFrame : メソッドは呼ばれないのか? ) 」に書かれています。FAQは、Interface Builderの「 Help → FAQ 」メニューを選択すると表示されます。

いくつかのAppleのサンプルコードを見てみましたが、同様にCustom Viewが配置されていましたのでこの方法で問題はないと思われます。

ちょっと補足:Appleのサイトのサンプルコードで3Dグラフィックスに関するものは、以下のサイトにあります。この中で、CocoaでのOpenGL入門によさそうなものは、Simple AppKitとCocoa InitGLです。

◇Sample Codes: Graphics 3D
 http://developer.apple.com/samplecode/Sample_Code/Graphics_3D.htm
‥‥‥‥‥‥‥この項、続く‥‥‥‥‥‥‥[鶴薗賢吾]‥‥‥‥‥‥‥
関連リンクCocoaはやっぱり!