2009-02-26 34 views
31

垂直同期をどのように有効にしますか?OpenGLで垂直同期を有効にする方法は?

glEnable(GL_VSYNC)のような単純なものですか? (GL_VSYNCなどのものはありませんが、glEnableが受け付けるオプションにはそのようなものはありません)。

またはopenglでこれを行う標準的な方法はありませんか?

答えて

41

Windowsでは、OpenGL拡張メソッドwglSwapIntervalEXTがあります。 b2b3 http://www.gamedev.net/community/forums/topic.asp?topic_id=360862によってポストから

----引用が始まる-----

あなたがWindows上で作業している場合は、 wglSwapIntervalExt機能を使用するための拡張機能を使用する必要があります。 wglext.hで定義されているのは です。また、 glext.hファイルをダウンロードすることもできます。 wglextファイルでは、Windows固有の拡張のすべてのエントリポイントは と宣言されています。このような機能はすべて、接頭辞wglの を開始します。 公開されているすべての拡張機能の詳細については、 OpenGL拡張レジストリを参照してください。

wglSwapIntervalEXTWGL_EXT_swap_control拡張子からです。 を使用すると、各バッファスワップの前にフレームの最小数を に指定できます。 通常、垂直 の同期に使用されます(スワップ の間隔を1に設定した場合)。全体の詳細は こちらをご覧ください。 この関数を使用する前に、カードにWGL_EXT_swap_controlの のサポートと のサポートがあるかどうかを照会し、wglGetProcAddress関数を使用して 関数へのポインターを取得する必要があります。その後

PFNWGLSWAPINTERVALEXTPROC  wglSwapIntervalEXT = NULL; 
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL; 

if (WGLExtensionSupported("WGL_EXT_swap_control")) 
{ 
    // Extension is supported, init pointers. 
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) LogGetProcAddress("wglSwapIntervalEXT"); 

    // this is another function from WGL_EXT_swap_control extension 
    wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) LogGetProcAddress("wglGetSwapIntervalEXT"); 
} 

:に必要なあなたの関数ポインタを初期化するには

#include <windows.h> 
#include "wglext.h" 

bool WGLExtensionSupported(const char *extension_name) 
{ 
    // this is pointer to function which returns pointer to string with list of all wgl extensions 
    PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT = NULL; 

    // determine pointer to wglGetExtensionsStringEXT function 
    _wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT"); 

    if (strstr(_wglGetExtensionsString(), extension_name) == NULL) 
    { 
     // string was not found 
     return false; 
    } 

    // extension is supported 
    return true; 
} 

:指定した拡張子のサポートをテストするために

あなたはこのように機能を使用することができますこれらのポインタを他のポインタとして使用して機能させることができます。 vyncを有効にするには、wglSwapIntervalEXT(1)を呼び出すことができます。これを無効にするには、wglSwapIntervalEXT(0)を呼び出します。

現在のスワップ間隔を取得するには、wglGetSwapIntervalEXT()を呼び出す必要があります。

----引用は、ここでは、それは、OpenGLのウィキにまとめられています-----

+2

if(strstr(_wglGetExtensionsStringEXT()、extension_name)== NULL) - しかし、ありがとう、これは私を助けました!!!(strstr(_wglGetExtensionsString()、extension_name)== NULL) – HoboBen

+3

また、LogGetProcAddressの代わりにwglGetProcAddressを使用しました。 – HoboBen

+3

これはOpenGLの拡張ではなく、WGL(OpenGLのMicrosoft WindowsウィンドウシステムAPI)です。バッファ交換は、その性質上、ウィンドウシステム固有の操作である。 GLに関しては、前後左右のバッファまたは任意のFBOを描画するだけです。描画されたバッファの表示を何らかのイベント(この場合はモニタの垂直リトレース)に同期させるために、基礎となるホストシステムについての十分な知識があるのは、ウィンドウシステムだけです。 –

10
+1

このページは非常に不完全であることに注意してください。そこにリストされている唯一のGLX Vsync拡張は、すべてのハードウェア用のほとんどのLinuxディストリビューションでのデフォルトのOpenGL実装であるMesaではサポートされていません。 GLX Vsyncの拡張機能の完全なリストについては、[my answer](http://stackoverflow.com/a/38914829/673852)を参照してください。 – Ruslan

0

WGL場合はanswer by eugensk00に記述されています。

CGL(MacOSX)他のSO質問にthis answerを参照してください。

EGL のためにそこにeglSwapInterval()機能だが、どうやらそれは裂けフリーの結果を保証するものではありません(thisthisを参照してください) - (多分それはドライバーを破らするだけの原因です)期間を与えられただけ待機し。

GLX(X11などのLinux)には、少なくとも3つの同じような拡張機能があり、さまざまな機能性があります。現在OpenGL wikiには1つしか表示されていません。これはMesa < = 10.5.9でサポートされていません。ここでは少なくともへ(OpenGLのウィキに記載されている)最も機能が完全な延長からのリストです:

  1. GLX_EXT_swap_control

    • セットスワップ間隔ごとの描画可能ごとの表示:glXSwapIntervalEXT(dpy, drawable, interval)

    • 現在のスワップ間隔を取得:glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &interval)

    • 最大スワップ間隔を取得:glXQueryDrawable(dpy, drawable, GLX_MAX_SWAP_INTERVAL_EXT, &maxInterval)

    • を無効のVsyncは:glXGetSwapIntervalMESA()

    • :現在のスワップ間隔を取得します glXSwapIntervalMESA(interval)

    • :0

  2. GLX_MESA_swap_control

    • セットごとのコンテキストスワップ間隔にintervalを設定しました

    • 最大スワップ間隔ゲット:

    • サポートされていないの無効化のVsyncを: glXSwapIntervalSGI(interval)interval
  3. GLX_SGI_swap_control

    • 0に設定しスワップ間隔を設定します。

    • 現在のスワップ間隔取得:サポートされていない

    • 無効信号Vsync:サポートされていないinterval==0がエラーである)

最大スワップ間隔を取得サポートされていない

  • 適応型Vsyncについては、OpenGL wikiを参照してください。

  • 関連する問題