TOTAL:219, TODAY:219

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

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.