我的问题是如何在X窗口系统中指定OpenGL版本,另外删除那些已弃用的函数。我的GL版本是4.3。我知道如何使用SDL或过剩来做到这一点。
答案 0 :(得分: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核心和/或转发兼容配置文件,这将禁用已弃用的功能。
答案 1 :(得分:0)
在没有兼容性配置文件的情况下为版本3/4创建GLX上下文会检测在运行时使用已弃用的函数。
如果希望编译器检测旧函数,则需要从http://www.opengl.org/registry/#apispecs下载glcorearb.h(以前称为gl3.h)的副本。调整源代码以确保#include这而不是旧的gl.h,并将-D__gl_h_添加到构建标志中以阻止其他头文件(例如glx.h)导入旧的API。