opengl - triple - sincronizacion vertical lol
cómo habilitar la sincronización vertical en OpenGL? (2)
En Windows existe el método de extensión OpenGL wglSwapIntervalEXT
. De la publicación de b2b3 http://www.gamedev.net/community/forums/topic.asp?topic_id=360862 :
Si está trabajando en Windows, debe usar extensiones para usar la función
wglSwapIntervalExt
. Se define en wglext.h. También querrá descargar el archivo glext.h. En el archivo wglext, se declaran todos los puntos de entrada para las extensiones específicas de Windows. Todas estas funciones comienzan con el prefijo wgl. Para obtener más información sobre todas las extensiones publicadas, puede consultar OpenGL Extension Registry.
wglSwapIntervalEXT
es de la extensiónWGL_EXT_swap_control
. Le permite especificar el número mínimo de cuadros antes de cada intercambio de buffer. Por lo general, se utiliza para la sincronización vertical (si configura el intervalo de intercambio en 1). Puede encontrar más información sobre la extensión completa aquí. Antes de usar esta función, necesita consultar si su tarjeta tiene soporte paraWGL_EXT_swap_control
y luego obtener un puntero a la función usando la funciónwglGetProcAddress
.Para probar el soporte de la extensión dada, puede usar una función como esta:
#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(_wglGetExtensionsStringEXT(), extension_name) == NULL)
{
// string was not found
return false;
}
// extension is supported
return true;
}
Para inicializar los punteros a su función, necesita:
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
// Extension is supported, init pointers.
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
// this is another function from WGL_EXT_swap_control extension
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
}
Luego puede usar estos punteros como cualquier otro puntero para funcionar. Para habilitar vync puede llamar a
wglSwapIntervalEXT(1)
, para deshabilitarlo llame awglSwapIntervalEXT(0)
.Para obtener el intervalo de intercambio actual, debe llamar a
wglGetSwapIntervalEXT()
.
¿Cómo habilita la sincronización vertical?
¿Es algo simple como glEnable(GL_VSYNC)
? (aunque no hay nada como GL_VSYNC ni nada parecido en las opciones que glEnable acepta).
o no hay una forma estándar de hacer esto en OpenGL?
El caso de WGL se describe en la respuesta de eugensk00 .
Para CGL (MacOSX) vea esta respuesta a otra pregunta SO.
Para EGL existe la función eglSwapInterval() , pero aparentemente (ver this y this ) no garantiza un resultado sin rasgaduras, solo espera un período dado (tal vez solo sea debido a controladores rotos).
Para GLX (Linux con X11, etc.) hay al menos 3 extensiones similares para esto, con un grado variable de funcionalidad. La wiki de OpenGL actualmente solo muestra una, que no está soportada por Mesa <= 10.5.9 (y tal vez más). Aquí hay una lista de la mayoría de las funciones completas de la extensión (enumeradas en OpenGL wiki) al menos:
Establecer intervalo de intercambio por dibujo por visualización:
glXSwapIntervalEXT(dpy, drawable, interval)
Obtenga el intervalo de intercambio actual:
glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &interval)
Obtenga el intervalo de intercambio máximo:
glXQueryDrawable(dpy, drawable, GLX_MAX_SWAP_INTERVAL_EXT, &maxInterval)
Deshabilitar Vsync: establecer el
interval
en 0
Establecer el intervalo de intercambio por contexto:
glXSwapIntervalMESA(interval)
Obtenga el intervalo de intercambio actual:
glXGetSwapIntervalMESA()
Obtener el intervalo de intercambio máximo: sin soporte
Deshabilitar Vsync: establecer el
interval
en 0
Establecer intervalo de intercambio:
glXSwapIntervalSGI(interval)
.Obtener el intervalo de intercambio actual: no admitido
Obtener el intervalo de intercambio máximo: sin soporte
Deshabilitar Vsync: no compatible (
interval==0
es un error)
Para Vsync adaptativa, consulte la wiki de OpenGL .