Mac OS X 10.2ではOpenGL環境もずいぶんと拡張されており、CarbonやCocoaアプリケーションからその能力をフルに活用することが出来ます。OpenGLに関連するライブラリーには、GL(OpenGL Library)、GLU(OpenGL Utility Library)、GLUT(OpenGL Utility Toolkit)の3つがあります。それとは別に、CarbonにはAGL(Apple OpenGL Library)、CocoaにはOpenGL Classが存在しており、OpenGLとMac OS Xの描画環境(ウィンドウやCGrafPort)を関連付ける役割を担当しています。
Mac OS 9でOpenGLの3Dオブジェクトをフルスクリーン描画する場合には、DrawSproketsのAPIを利用していました。しかし、Mac OS Xでは、AGLやOpenGL Classの下層にCGL(Core OpenGL)と呼ばれるAPI群が存在しており、それらとCoreGraphics(Quartz 2D)のDirectDisplay機能を併用することで同様な描画を実現出来ます。
最初に、ウィンドウ上にOpenGLの3Dオブジェクトを描画する例を見てみます。Main.nibファイルにOpenGLWindowという名称のウィンドウオブジェクトを作成します。縦横サイズは正方形(512x512ぐらい)としてください。それをCreateWindowFromNib()で読み込み、WindowRefを得たら、createOpenGLContext()でAGLContext(OpenGL描画環境)にウィンドウのCGrafPortを設定します。続いてinitOpenGLContext()でOpenGLによる描画方法を決めたら、drawOpenGLContext()で実際に3Dオブジェクトを描画します。この時の描画はダブルバッファの裏バッファへと行われますので、最後にaglSwapBuffers()を実行して表バッファへと切り替えれば、ウィンドウ上に画像が現れます。

createOpenGLContext()では、aglChoosePixelFormat()に各種アトリビュートを代入することで3D描画用ピクセルフォーマットを決めます。今回はRGBA(αチャンネル付きRGB画像)、DOUBLEBUFFER(ダブルバッファあり)、DEPTH SIZE=16(Zバッファあり)と設定しています。続いて、aglCreateContext()でAGLContexを作成したら、aglSetDrawable()で描画対象をウィンドウのCGrafPortと一致させます。最後にaglSetCurrentContext()により、それを現在の描画対象にセットして準備完了です(QuickDrawのSetPort()と同様)。

initOpenGLContext()では、描画方法の決定、赤色のライティング、3Dオブジェクトの射影変換等を処理しています。続くdrawOpenGLContext()では、バッファを黒色でクリアした後に、X軸と軸各30度回転させた3Dティーポットを、GLUTに属するglutSolidTeapot()を使い描画しています。


GL、GLU、GLUTに属するAPIについての詳しい解説は省略しますが、OpenGL APIに関しては以下の2冊の書籍を参考にされることをお勧めします。OpenGLの赤本、青本と呼ばれている書籍です(笑)。
「OpenGL プログラミング ガイド」(株式会社ピアソン・エデュケーション)
「OpenGL リファレンスマニュアル」(株式会社ピアソン・エデュケーション)
http://www.pearsoned.co.jp/washo/prog/wa_pro16-j.html
次はウィンドウではなく、フルスクリーン(メニューも消す)に3Dオブジェクトを描画してみます。最初に呼ばれているCGDisplayCapture()とCGDisplayIDToOpenGLDisplayMask()は、DirectDisplay APIです。メインモニターを占有し、それをOpenGL環境として利用することをシステムに通知します。それ以後の処理は、createOpenGLContext()でAGL APIを用いていたことを、代わりにCGL APIで実行しているだけです。裏から表バッファへの切り替えも、AGLのaglSwapBuffers()ではなく、CGLのCGLFlushDrawable()の方を使います。

今回は投影時の縦横比を変更していませんので、少々ひしゃけた3Dティーポットが表示されます。描画は5秒間続き、CGLClearDrawable()とCGLDestroyContext()で後処理をしています。その後CGReleaseAllDisplays()を呼ぶことで、何事もなかったようにフルスクリーンから通常表示へと切り換わります。直前の画面やメニュー表示の復帰などは、すべて自動で行われます(便利!)。
OpenGL関連のAPIが定義されているUniversal Interfacesは、OpenGL.h、agl.h、gl.h、glu.h、glut.h、glext.hなどです。また、CoreGraphics(Quartz 2D)のDirectDisplayに関係するヘッダファイルはCGDisplayConfiguration.hとCGDirectDisplay.hです。OpenGLを利用する場合には、プロジェクトにOpenGL、AGL、GLUTの3つのFrameWorkを登録しておき、ソースファイルの先頭で以下のヘッダファイルを呼び出すようにします。
#include <OpenGL/OpenGL.h>
#include <AGL/agl.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <OpenGL/glext.h>
#include <GLUT/glut.h>
アプリケーションによっては、すべてのFrameworkやヘッダファイルが必要と言うわけではありませんが、こうしておけばOpenGL関連のほとんどすべてのAPIや定数を参照することが可能です。OpenGLに関心のある方は、Apple社の以下のサイトを参照してください。
http://developer.apple.com/opengl/
最新のトピックス、関連ドキュメント、OpenGLの仕様書、OpenGLの拡張仕様、サンプルソースコードなど、あらゆるリソースにここからアクセスすることが可能です。
copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp