Oni グラフィック機能の詳細仕様 |
ドキュメントの目次 |
この文章はOniのグラフィック機能の細かな仕様を解説します。実際にグラフィック機能を使用する方法は、「仮想プラットフォーム仕様」を参照してください。
Oni Graphicsで現在サポートされているOpenGLのインターフェースはバージョン1.2.1までです。ただし、実行環境のOpenGLがそれ以降の場合でも使用にはさし支えません。
現在の仕様ではOpenGLコンテキストを初期化するPixelFormatがハードウェアアクセラレーションに対応していない場合、PixelFormatのリストから除外しています。そのためハードウェアアクセラレーションの効かない環境ではOniのGraphics機能を使うことは出来ません。ただし、アプリケーションの起動時にアクセラレーションが効かなくても、ディスプレイの設定を変えることによってアクセラレーションが効くようになる場合があります。例えば、はじめに640x480ピクセルの16bitカラー等でフルスクリーンにしてアクセラレーションの是非を確かめる方法があります。
Oniでは現在以下のOpenGL Extensionをサポートしています。サポートするExtensionは今後も追加される予定です。
現在のサポート状況はgluの一部の機能をサポートしているだけです。対応していないgluの命令は主にコールバック関数を必要とする命令です。
glutに関しては、Windowsで実行する場合にglut32.dllが必要になり、これは普通の環境にはインストールされてません。そのため今バージョンでは採用を見送りました。
両方とも今後の機能追加は未定です。
-Pointer系の関数(glVertexPointer、glColorPointer等)で、Javaのプリミティブ配列を引数にとるのをやめてNativeArrayクラスを採用した理由は、Javaのガーベージコレクションスレッドによるメモリ移動の影響を回避するためです。
OpenGLの他の関数と違って-Pointer系の関数は、渡した参照がすぐに使用されるわけではなく、glDrawElements等の命令がきた時点で登録したメモリの参照を行います。
そのため、glVertexPointer等でJavaの配列を登録してからglDrawElements等などが呼ばれるまでの間にガーベージコレクションのスレッドによって実際の配列のメモリが移動されて、結果正しい描画結果が得られない、または最悪の場合はアプリケーションがクラッシュしてしまう可能性があります。
NativeArrayはネイティブ配列領域を確保し、この配列領域はオブジェクトが消滅するまで同じメモリ領域に存在する事が保証されます。
OniのGraphics機能では、基本的に最大限のパフォーマンスを出すためにエラーチェックの処理は最小限に押さえています。そのため、関数に渡す配列の容量が足りなかったりした場合には、予測不能な動作やアプリケーションのクラッシュを引き起こします。十分注意して下さい。
また、高度なエラーチェック機能はGLDebugGraphicsクラスでサポートします。配列の要素越えなどのチェックは現在サポートされていませんが今後サポートされる予定です。
Oniは今後のOpenGLのバージョンアップに迅速に対応する予定です。