3

我的问题是如何在 X 窗口系统中指定 OpenGL 版本并删除那些已弃用的函数。我的 GL 版本是 4.3。我知道如何使用 SDL 或 glut 来做到这一点。

4

2 回答 2

6

首先,您必须首先知道如何使用裸 X11 / Xlib 创建 OpenGL 上下文。看看这段代码https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c

为了使这实际上选择一个现代版本配置文件,使用了这个代码块

#if USE_GLX_CREATE_CONTEXT_ATTRIB
    #define GLX_CONTEXT_MAJOR_VERSION_ARB       0x2091
    #define GLX_CONTEXT_MINOR_VERSION_ARB       0x2092
    render_context = NULL;
    if( isExtensionSupported( glXQueryExtensionsString(Xdisplay, DefaultScreen(Xdisplay)), "GLX_ARB_create_context" ) ) {
        typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
        glXCreateContextAttribsARBProc glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );
        if( glXCreateContextAttribsARB ) {
            int context_attribs[] =
            {
                GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
                GLX_CONTEXT_MINOR_VERSION_ARB, 0,
                //GLX_CONTEXT_FLAGS_ARB        , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
                None
            };

            int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler);

            render_context = glXCreateContextAttribsARB( Xdisplay, fbconfig, 0, True, context_attribs );

            XSync( Xdisplay, False );
            XSetErrorHandler( oldHandler );

            fputs("glXCreateContextAttribsARB failed", stderr);
        } else {
            fputs("glXCreateContextAttribsARB could not be retrieved", stderr);
        }
    } else {
            fputs("glXCreateContextAttribsARB not supported", stderr);
    }

    if(!render_context)
    {
#else

选择使用 GLX_CONTEXT_FLAGS 核心和/或前向兼容配置文件,这会禁用已弃用的功能。

于 2013-07-12T06:22:07.490 回答
0

在没有兼容性配置文件的情况下为版本 3/4 创建 GLX 上下文会检测在运行时使用已弃用的函数。

如果您希望编译器检测旧函数,则需要从http://www.opengl.org/registry/#apispecs下载 glcorearb.h(以前称为 gl3.h)的副本。调整源代码以确保您#include this 而不是旧的gl.h,并将-D__gl_h_ 添加到您的构建标志中以阻止其他头文件(例如glx.h)导入旧的API。

于 2013-07-15T04:31:22.403 回答