GLEWを使ったOpenGL拡張
NVIDIAのSDK10にGLEWというライブラリが含まれています。どうやらOpenGL拡張を簡単に使うようにするためのライブラリみたいなので、早速インストールしてみました。これまで、OpenGL1.2以降のgl関数や、プラットホーム依存の関数を使用するには、wglGetProcAddressにより関数へのポインタを取得する必要がありましたが、これも不要になることが分かったので、今後はこれを使ったサンプルにしようと思います。まず、次のサイトからGLEWをダウンロードします。Linux(Fedora)で使用したい方は、「FedoraでOpenGL」を参考にしてください。
2007年4月現在の最新はv1.3.6でしたので、バイナリのglew-1.3.6-win32.zipをダウンロードします。ZIPファイルを展開すると、インクルードファイルやライブラリができるので、各々を下記のディレクトリにコピーします。4月27日にv1.4.0がリリースされたようです。早速1.4.0にアップし、これまでのプログラムも問題なく動くことを確認しました。インストール方法もこれまで通りです。1.4.0は若干バグ修正されているようなので、新しい方をお勧めします。
| glew.h, wglew.h | C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\gl |
| glew32.lib | C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib |
| glew32.dll | C:\WINDOWS\system32 |
この後、プログラムがインクルードしているヘッダーを次のように変更します。gl.h, glext.h, wglext.hのインクルードをglew.h, wglew.hのインクルードに置き換えます。
// 変更前 //#include <GL/gl.h> //#include <GL/glut.h> //#include <GL/glx.h> //#indlude <GL/wgl.h> // 変更後 #include <GL/glew.h> #indluce <GL/wglew.h> #include <GL/glut.h>
そして、VC++ Expressの「プロジェクト」メニューの「プロパティ」を選びます。すると、次のようなダイアログがでてくるので、「構成プロパティ」-「リンカ」-「入力」の選択し、「追加の依存ファイル」部分に、glew32.libを追加します。

この後、main関数において、次のようにglewInit関数を一度呼び出すことで、GL1.2以降のgl関数、プラットホーム依存の関数wgl***、そしてベンダー独自の関数をwglGetProcAddressを呼ばずに使用することができます。
int main(int argc, char *argv[])
{
GLenum err;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(screenWidth, screenHeight);
glutCreateWindow(argv[0]);
/* GLEW初期化 */
err = glewInit();
if (err != GLEW_OK)
{
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
}
前回の頂点バッファ系の関数をwglGetProcAddressを使用せずに直接呼び出すプログラムを作成しました。また、ダウンロードしたファイルには、bin/visualinfo.exeというファイルがあり、これを実行すると、visualinfo.txtというファイルができます。これには、自分のPCで使用可能なプラットホーム依存の関数やベンダー独自の関数が次のような感じでリストアップされます。
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce 6600 GT/AGP/SSE2
OpenGL version string: 2.0.3
OpenGL extensions (GL_):
GL_ARB_color_buffer_float, GL_ARB_depth_texture, GL_ARB_draw_buffers,
: : 途中略 : :
WGL_EXT_swap_control. <-- 垂直同期なしのスワップを可能にする関数
GLU version string: 1.2.2.0 Microsoft Corporation
GLU extensions (GLU_):
この中で、スワップするタイミングを制御可能な関数WGL_EXT_swap_controlを使います。これまでNVIDIAのコントロールパネルで設定していた垂直同期の制御をプログラムでコントロールできるようになります。今回は、main.cにあるkeyboard関数を変更しました。次のように、「s」が押されたときに、垂直同期待ちをオフにしたり、1回待つ設定にします。この設定は、wglSwapIntervalEXTで可能です。
static void keyboard(unsigned char key, int x, int y)
{
: : 途中略 : :
else if (key == 's' || key == 's')
{
/* 描画モード切替 */
if (glewGetExtension("WGL_EXT_swap_control"))
{
vsync = 1 - vsync;
if (vsync == 0)
wglSwapIntervalEXT(0);
else
wglSwapIntervalEXT(1);
}
}
}
この関数が使用できるかどうかは、glewGetExtension("拡張名")でを判定可能です。拡張名が分からない場合は、GLEWのサイトにあるの次のサイトを参考にしてください。
プログラムを動かせば、次のような絵が描画されるので、「s」を押してみてください。高速に回転することが分かると思います。
Linux(Fedora)用に移植したプログラムも作成しました。(2007/06/19)

これまでのサンプルでは、wglext.hやglext.hを使用していましたが、それらのファイルを消す必要がないところも、いいですね。気に入ってしまいました。
最新の7件
OpenGL
電子工作
玄箱HG
- ClamAVのアップデート
- Smartyも入れてみる
- etchでPHP4->PHP5
- etchでのSamba設定
- etchでのメール設定
- 玄箱HGのetch化
- Webdruidでログ解析
- PEARも入れてみる
- 玄箱WEBのUTF-8化
- phpMyAdminでMySQL
- postmasterの変更
- ウィルスメール対策
- SPAMメール対策
- メールサーバ(IMAP)
- メールサーバ(Postfix)
- 猫にXOOPS
- PHPも入れてみる
- MySQLを入れてみる
- Subversion導入
- WebDav導入
- Apacheのrewrite機能
- Apacheディレクトリ設定
- Apache1.3->2.0
- ddclientの設定
- 静かな玄箱
- ユーザ追加