読者です 読者をやめる 読者になる 読者になる

OpenGLのVSync待ち

OpenGLでVSyncを待つようにをするには、wgl(Windows)ではwglSwapIntervalEXT関数、glX(X11)ではglXSwapIntervalEXT関数またはglXSwapIntervalSGI関数を使います。しかし、これらは拡張関数なので対応しているかどうかを調べたほうが良いでしょう。

拡張に対応しているかどうかを調べる

wglの場合
GLubyte const* glGetString(GLenum); 
// glGetString( GL_EXTENSIONS )のようにして呼び出すだけ

glGetStringにGL_EXTENSIONSを渡して文字列を取得します。

char const* wglGetExtensionsStringEXT();
char const* wglGetExtensionsStringARB(HDC);

これらの関数も呼び出してそれぞれ文字列を取得しますが、この2つの関数自体も拡張関数なのでwglGetProcAddress関数を使ってアドレスを取得しましょう。
そして、wglSwapIntervalEXT関数を使いたい場合、取得したいずれかの文字列の中に次の文字列がないといけません。

"WGL_EXT_swap_control"

あればwglSwapIntervalEXT関数を使うことができます。

glXの場合
GLubyte const* glGetString(GLenum); 
// glGetString( GL_EXTENSIONS )のようにして呼び出すだけ

glGetStringにGL_EXTENSIONSを渡して文字列を取得します。

char const* glXGetClientString(Display*, GLenum name); // GLenum nameにGLX_EXTENSIONSを渡す
char const* glXQueryExtensionsString(Display*, int screen);

これらの関数も呼び出して文字列を取得します。この時、glXGetClientString関数のGLenum nameにGLX_EXTENSIONSを渡すと対応している拡張の文字列が得られます。また、これらは拡張関数ではないのでそのまま呼び出すことができます。
そして、glXSwapIntervalEXT関数またはglXSwapIntervalSGI関数を使いたい場合、取得したいずれかの文字列の中に次のいずれかの文字列がないといけません。

"GLX_EXT_swap_control"
"GLX_SGI_swap_control"

GLX_EXT_swap_controlがあればglXSwapIntervalEXT関数、
GLX_SGI_swap_controlがあればglXSwapIntervalSGI関数が使えます。

SwapInterval

wglの場合は、

BOOL wglSwapIntervalEXT(int interval);

となっており、wglGetProcAddress関数を使ってこの関数のアドレスを取得して使用できます。

glXの場合は、

void glXSwapIntervalEXT(Display*, GLXDrawable, int interval);
int glXSwapIntervalSGI(int interval);

のいずれかで、対応している関数をglXGetProcAddress関数を使ってアドレスを取得して使用できます。

いずれの関数においてもint intervalがVSyncを何回待つかを決めるための引数です。例えば、int intervalに0を渡すとVSyncを待たず、1を渡すとVSyncを1回待つ。2を渡すとVSyncを2回待つようになります。



SwapIntervalやそれぞれの関数の詳細については以下を参照のこと。

http://www.opengl.org/wiki/Swap_Interval

http://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt
http://www.opengl.org/registry/specs/SGI/swap_control.txt
http://www.opengl.org/registry/specs/EXT/swap_control.txt

http://msdn.microsoft.com/ja-jp/library/windows/desktop/dd374386(v=vs.85).aspx
http://www.opengl.org/sdk/docs/man2/xhtml/glXGetProcAddress.xml

http://www.opengl.org/wiki/GLAPI/glGetString
http://www.opengl.org/registry/specs/EXT/wgl_extensions_string.txt
http://www.opengl.org/registry/specs/ARB/wgl_extensions_string.txt
http://www.opengl.org/sdk/docs/man2/xhtml/glXGetClientString.xml
http://www.opengl.org/sdk/docs/man2/xhtml/glXQueryExtensionsString.xml