2012年9月19日 星期三

精簡版 OpenGL 3.x/4.x+ 初始化

以下的程式碼會用 root window 建立一個 legacy render context,然後再呼叫 glXCreateContextAttribsARB 建立指定版本的 render context。
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <GL/glx.h>
#include <GL/gl.h>
#include <GL/glext.h>

GLXContext glXCreateContextAttribsARB(Display*, GLXFBConfig, GLXContext, Bool, const int*);

int main(int argc, char **argv)
{
	int visual_attr[] = {	GLX_RGBA,
				GLX_DOUBLEBUFFER,
				GLX_RED_SIZE, 8,
				GLX_GREEN_SIZE, 8,
				GLX_BLUE_SIZE, 8,
				GLX_DEPTH_SIZE, 16,
				0 };

	int version_attr[] = {	GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
				GLX_CONTEXT_MINOR_VERSION_ARB, 3, 0};
	int nitems;

	Display* display = NULL;
	Window window;
	XVisualInfo* vi = NULL;
	GLXContext rc = 0;
	GLXContext newrc = 0;
	GLXFBConfig* fbconfig = NULL;

	display = XOpenDisplay(NULL);
	window = XRootWindow(display, 0);
	fbconfig = glXChooseFBConfig(display, DefaultScreen(display), 0, &nitems);

	vi = glXChooseVisual(display,DefaultScreen(display),visual_attr);
	rc = glXCreateContext(display, vi, 0, GL_TRUE);
	glXMakeCurrent(display, window, rc);

	newrc = glXCreateContextAttribsARB(display, *fbconfig, 0, 1, version_attr);
	if(newrc)
		glXDestroyContext(display, rc);

	XCloseDisplay(display);

	return EXIT_SUCCESS;
}