Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help

       glXIntro	- Introduction to OpenGL in the	X window system

       OpenGL  (called	GL  in	other pages) is	a high-performance 3D-oriented
       renderer.  It is	available in the X window system through the  GLX  ex-
       tension.	  To  determine	whether	the GLX	extension is supported by an X
       server, and if so, what version is  supported,  call  glXQueryExtension
       and glXQueryVersion.

       GLX  extended  servers  make  a	subset	of their visuals available for
       OpenGL rendering.  Drawables created with these	visuals	 can  also  be
       rendered	using the core X renderer and with the renderer	of any other X
       extension that is compatible with all core X visuals.

       GLX extends drawables with several  buffers  other  than	 the  standard
       color  buffer.  These buffers include back and auxiliary	color buffers,
       a depth buffer, a stencil buffer,  and  a  color	 accumulation  buffer.
       Some or all are included	in each	X visual that supports OpenGL.

       To render using OpenGL into an X	drawable, you must first choose	a vis-
       ual that	defines	the required OpenGL buffers.  glXChooseVisual  can  be
       used to simplify	selecting a compatible visual.	If more	control	of the
       selection process is required, use XGetVisualInfo and  glXGetConfig  to
       select among all	the available visuals.

       Use the selected	visual to create both a	GLX context and	an X drawable.
       GLX contexts are	created	with glXCreateContext, and drawables are  cre-
       ated  with  either  XCreateWindow or glXCreateGLXPixmap.	 Finally, bind
       the context and the drawable together using glXMakeCurrent.  This  con-
       text/drawable  pair  becomes  the current context and current drawable,
       and it is used by all OpenGL commands until  glXMakeCurrent  is	called
       with different arguments.

       Both  core  X and OpenGL	commands can be	used to	operate	on the current
       drawable.  The X	and OpenGL command streams are not synchronized,  how-
       ever,  except  at  explicitly  created  boundaries generated by calling
       glXWaitGL, glXWaitX, XSync, and glFlush.

       Below is	the minimum code required to create an RGBA-format,  X	window
       that's  compatible  with	OpenGL and to clear it to yellow.  The code is
       correct,	but it does not	include	any  error  checking.	Return	values
       dpy, vi,	cx, cmap, and win should all be	tested.

       #include	<GL/glx.h> #include <GL/gl.h> #include <unistd.h>

       static  int  attributeListSgl[]	=  {	  GLX_RGBA,	 GLX_RED_SIZE,
       1, /*get	the deepest buffer with	1 red  bit*/	   GLX_GREEN_SIZE,  1,
	    GLX_BLUE_SIZE,  1,	    None };

       static  int  attributeListDbl[] = {	GLX_RGBA,      GLX_DOUBLE_BUF-
       FER, /*In case single buffering is not  supported*/	 GLX_RED_SIZE,
       1,      GLX_GREEN_SIZE, 1,      GLX_BLUE_SIZE,  1,      None };

       static Bool WaitForNotify(Display *d, XEvent *e,	char *arg) {
	   return (e->type == MapNotify) && (e->xmap.window == (Window)arg); }

       int main(int argc, char **argv) {
	   Display *dpy;
	   XVisualInfo *vi;
	   Colormap cmap;
	   XSetWindowAttributes	swa;
	   Window win;
	   GLXContext cx;
	   XEvent event;
	   int swap_flag = FALSE;

	   /* get a connection */
	   dpy = XOpenDisplay(0);

	   /* get an appropriate visual	*/
	   vi =	glXChooseVisual(dpy, DefaultScreen(dpy), attributeListSgl);
	   if (vi == NULL) {
	      vi = glXChooseVisual(dpy,	DefaultScreen(dpy), attributeListDbl);
	      swap_flag	= TRUE;

	   /* create a GLX context */
	   cx =	glXCreateContext(dpy, vi, 0, GL_TRUE);

	   /* create a color map */
	   cmap	   =	XCreateColormap(dpy,	RootWindow(dpy,	  vi->screen),
			 vi->visual, AllocNone);

	   /* create a window */
	   swa.colormap	= cmap;
	   swa.border_pixel = 0;
	   swa.event_mask = StructureNotifyMask;
	   win = XCreateWindow(dpy, RootWindow(dpy, vi->screen),  0,  0,  100,
			       0, vi->depth, InputOutput, vi->visual,
			       CWBorderPixel|CWColormap|CWEventMask, &swa);
	   XMapWindow(dpy, win);
	   XIfEvent(dpy, &event, WaitForNotify,	(char*)win);

	   /* connect the context to the window	*/
	   glXMakeCurrent(dpy, win, cx);

	   /* clear the	buffer */
	   if (swap_flag) glXSwapBuffers(dpy,win);

	   /* wait a while */
	   sleep(10); }

       A  color	map must be created and	passed to XCreateWindow.  See the pre-
       ceding example code.

       A GLX context must be created and attached  to  an  X  drawable	before
       OpenGL  commands	can be executed.  OpenGL commands issued while no con-
       text/drawable pair is current result in undefined behavior.

       Exposure	events indicate	that all buffers associated with the specified
       window  may  be damaged and should be repainted.	 Although certain buf-
       fers of some visuals on some systems may	never require repainting  (the
       depth buffer, for example), it is incorrect to write a program assuming
       that these buffers will not be damaged.

       GLX commands manipulate XVisualInfo structures rather than pointers  to
       visuals	or  visual  IDs.  XVisualInfo structures contain visual, visu-
       alID, screen, and depth elements, as well as other X-specific  informa-

       All  supported  GLX  extensions will have a corresponding definition in
       glx.h and a token in the	extension string  returned  by	glXQueryExten-
       sionsString.   For  example,  if	 the EXT_visual_info extension is sup-
       ported, then this token will be defined in  glx.h  and  EXT_visual_info
       will  appear  in	 the  extension	 string	returned by glXQueryExtension-
       sString.	The definitions	in glx.h can be	used at	compile	time to	deter-
       mine  if	procedure calls	corresponding to an extension exist in the li-

       OpenGL itself has also been extended. Refer to glIntro for more	infor-

GLX 1.1	and GLX	1.2
       GLX  1.2	 is  now supported. It is backward compatible with GLX 1.1 and
       GLX 1.0.

       GLX 1.2 corresponds to OpenGL version 1.1 and introduces	the  following
       new call: glGetCurrentDisplay.

       GLX  1.1	corresponds to OpenGL version 1.0 and introduces the following
       new calls: glXQueryExtensionsString, glXQueryServerString, and  glXGet-

       Call  glQueryVersion  to	 determine  at	runtime	what version of	GLX is
       available. glQueryVersion returns the version that is supported on  the
       connection. Thus	if 1.2 is returned, both the client and	server support
       GLX 1.2.	 You can also check the	GLX version at compile time:  GLX_VER-
       SION_1_1	 will  be  defined in glx.h if GLX 1.1 calls are supported and
       GLX_VERSION_1_2 will be defined if GLX 1.2 calls	are supported.

       glIntro,	glFinish, glFlush, glXChooseVisual, glXCopyContext,
       glXCreateContext, glXCreateGLXPixmap, glXDestroyContext,
       glXGetClientString, glXGetConfig, glXIsDirect, glXMakeCurrent,
       glXQueryExtension, glXQueryExtensionsString, glXQueryServerString, glX-
       QueryVersion,  glXSwapBuffers,  glXUseXFont, glXWaitGL, glXWaitX, XCre-
       ateColormap, XCreateWindow, XSync



Want to link to this manual page? Use this URL:

home | help