glXIntro.3gl




Name

  glXIntro - Introduction to OpenGL in the X window system



OVERVIEW
  OpenGL is a high-performance 3-D-oriented renderer.  It is available in the
  X window system through the GLX extension.  Use glXQueryExtension and
  glXQueryVersion to establish whether the GLX extension is supported by an X
  server, and if so, what version is supported.

  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 visual
  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 created
  with either XCreateWindow or glXCreateGLXPixmap.  Finally, bind the context
  and the drawable together using glXMakeCurrent.  This	context/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, however,
  except at explicitly created boundaries generated by calling glXWaitGL,
  glXWaitX, XSync, and glFlush.


Examples

  Below	is the minimum code required to	create an RGBA-format, OpenGL-
  compatible X window and 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 attributeList[] = { GLX_RGBA, 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;

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

      /* get an	appropriate visual */
      vi = glXChooseVisual(dpy,	DefaultScreen(dpy), attributeList);

      /* 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, 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 */
      glClearColor(1,1,0,1);
      glClear(GL_COLOR_BUFFER_BIT);
      glFlush();

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



Notes

  A color map must be created and passed to XCreateWindow.  See	the example
  code above.

  A GLX	context	must be	created	and attached to	an X drawable before OpenGL
  commands can be executed.  OpenGL commands issued while no context/drawable
  pair is current are ignored.

  Exposure events indicate that	all buffers associated with the	specified
  window may be	damaged	and should be repainted.  Although certain buffers of
  some visuals on some systems may never require repainting (the depth
  buffer, for example),	it is incorrect	to code	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, visualID,
  screen, and depth elements, as well as other X-specific information.



See Also

  glFinish, glFlush, glXChooseVisual, glXCopyContext, glXCreateContext,
  glXCreateGLXPixmap, glXDestroyContext, glXGetConfig, glXIsDirect,
  glXMakeCurrent, glXQueryExtension, glXQueryVersion, glXSwapBuffers,
  glXUseXFont, glXWaitGL, glXWaitX, XCreateColormap, XCreateWindow, XSync


Introduction | Alphabetic | Specification

Last Edited: Mon, May 22, 1995

AFV