第5章: OpenGL拡張の初歩

OpenGL拡張により新しい機能と高パフォーマンスが可能になります。幾つかの拡張では完全に新しい機能を提供します。たとえば、コンボリューション(convolution)拡張は、フィルター・カーネルを使用した画像のぼかし(blur)や鮮明化(sharpen)を可能とします。その他の拡張は現存する機能を高めます。たとえば、サブテクスチャ拡張は全ての画像を再度ロードすることなくテクスチャの一部を交換することを可能にします。

幾つかの拡張はOpenGL1.0では利用できないIRIS GLの機能を提供します。ですから、もしIRIS GLのプログラムをOpenGLにポーティングしているのでしたら、いくつかの拡張が特に役に立つでしょう。IRIS GLのコマンドとそれに対応するOpenGLの機能についてのリストは付録A「OpenGLとIRIS GL」を参照してください。

この章ではOpenGL拡張に関する基本的な情報を提供します。ここでは以下の事について学びます:


拡張が利用可能かどうかの判断

OpenGL拡張の関数名とトークンには、EXTとベンダー特有の略語が接尾語として付加されます。たとえば、glConvolutionFilter2DEXT()とかglColorTableSGI()のようになります。拡張そのものの名前(拡張文字列)は接頭語を利用します。たとえば、SGI_color_tableのようになります。以下に全ての接尾語と接頭語の詳細なリストを示します。


OpenGL拡張が利用可能かどうかを確認する方法

サポートされる全ての拡張はgl.hに定義され、glGetString()によって返される拡張文字列内のトークンを持ちます。たとえばABGR拡張(EXT_abgr)がサポートされている場合、gl.hに以下のように定義されます。

#define GL_EXT_abgr 1

そしてGL_EXT_abgrがglGetString()で返される拡張文字列内に存在します。コンパイル時は、ライブラリの中にプロシージャ呼び出しに対応する拡張が存在するかどうかを判断するためにgl.h内の定義を使用してください。

アプリケーションはコンパイル時のチェック(たとえばGL_EXT_abgrが定義されているかを知る)や、実行時のチェック(たとえばglGetString()で返される拡張文字列にGL_EXT_abgrがあるかを知る)を実行したほうがよいでしょう。

利用可能かどうかはオペレーティングシステムだけでなく使用しているハードウエアにも依存します。5.3のOpenGLライブラリはGL_CONVOLUTION_2D_EXTをサポートしていますが、IndyシステムでglConvolutionFilter2DEXT() を呼び出すとGL_INVALID_OPERATIONTION エラーが返されます。


プログラム例: 拡張が利用可能であるかの確認

例5-1では関数QueryExtention()で拡張が利用可能であるかをチェックします。

例5-1 拡張のチェック

main(int argc, char* argv[]) {
...
   if (!QueryExtension("GL_EXT_texture_object")) {
       fprintf(stderr, "texture_object extension not supported.\n");
         exit(1);
   }
...
}

static GLboolean QueryExtension(char *extName)
{
   /*
   ** 拡張文字列中のextNameを検索する。拡張名は他の拡張名の接頭語になりうるので、
   ** strstr()の利用のみでは十分ではない。
   ** strtok()が使えるが、glGetString()から返される定数文字列はROM内にセットされている。
   */
   char *p;
   char *end;
   int extNameLen;   

   extNameLen = strlen(extName);

   p = (char *)glGetString(GL_EXTENSIONS);
   if (NULL == p) {
       return GL_FALSE;
   }

   end = p + strlen(p);   

   while (p < end) {
       int n = strcspn(p, " ");
       if ((extNameLen == n) && (strncmp(extName, p, n) == 0)) {
           return GL_TRUE;
       }
       p += (n + 1);
   }
   return GL_FALSE;
}

各拡張を明示的にチェックするもう一つの方法として、プログラムを実行させるシステムやIRIXのリリースに関する情報を得るために以下の呼び出しを行うことができます。

glGetString(GL_RENDERER)
...
glGetString(GL_VERSION)

そのシステムにおけるそのリリースでサポートされる拡張のリストを得ることができるので、特に必要な拡張が利用可能かどうかを判断することができます。この作業を全てのシステムについて行えば、それぞれのシステムでサポートされる拡張の表が利用可能になります。拡張が不完全な場合は、拡張文字列の中には含まれません。IRIX5.3でサポートされるRealityEngineの拡張の幾つか(たとえばサブテクスチャ、鮮明テクスチャ(sharpen texture)、コンボリューション(convolution)、ヒストグラム(histogram)などの拡張)は、こういったものの範疇に入ります。


GLX拡張が利用可能であるかの確認

第9章「GLXの拡張」で説明されているGLX拡張を使用する場合も、それが利用可能であるかどうかの確認をする必要があります。

GLX拡張のサポート情報の問い合わせはOpenGL拡張のサポート情報の問い合わせに似ていますが、以下の点で異なっています。

これらの例外を考慮して「OpenGL拡張が利用可能かどうかを確認する方法」を適用してください。


拡張に関する情報の検索

この本は幾つかの拡張についてやや詳細な情報を網羅していますが、glintroリファレンスページを参照することによりお持ちのシステムにおける拡張の現状についての情報を得るのが便利な場合もあります。お手元のシステムのGLX拡張に関するさらなる情報についてはglXintroリファレンスページを参照してください。

拡張のリファレンスページは拡張が利用可能であるマシンに含まれていることに注意してください。新しいオプションを含んだその他のリファレンスページは、拡張が改訂される都度利用可能になります。

ogl_dev.sw.samples サブシステムがインストールされているなら、全ての完全な(短いコードの断片になっていない)プログラム例は /usr/share/src/OpenGLにあります。