| This article begins a monographic
			series on OpenGL and its support on Linux. It is 
			intended for programmers who wish to learn how to
			add high-performance 2D and 3D graphics in their
			applications. OpenGL is without a doubt the prevailing industry API
             for developing 2D and 3D graphical applications. It can
             be considered the successor to the formidable Silicon
             Graphics IRIS GL-library which made so popular SGI
             workstations as the predilect platform for scientific,
             engineering and special effects development. SGI put into
             OpenGL a great deal of their expertise to make an
             easy-to-use, intuitive, portable and network aware API
             for the future. At the same time we can credit SGI for
             realizing the importance of open standards. Several
             hardware and software makers took part in OpenGL's
             specification and stand behind it. Thanks to this, OpenGL
             applications can be ported quite easily to virtually any
             platform in the market, from PC windows95, to our
             glorious Linux system, high-end UNIX workstations, right
             up to mainframe supercomputers. The Architectural
             Review Board  oversees OpenGL specifications,
             accepting or rejecting changes and proposing conformance
             tests.
              In contrast to the old IRIS GL-library of SGI, OpenGL
             is by design, platform and operating system
             independent. It is aware of the network, so it is
             possible to separate our OpenGL application into a server
             and a client which actually renders the graphics. There
             is a protocol to move through the network OpenGL commands
             between server and client. Thanks to its OS independence,
             server and client do not have to run on the same type of
             platform. Quite commonly the server may be a
             supercomputer running a complex simulation and the client
             a simple workstation mostly devoted to the graphical
             visualization. OpenGL allows developers to write
             applications that can be easily deployed across many
             platforms.
              Above all OpenGL is a streamlined, high-performance
             graphics rendering library and there are many graphic
             accelerator cards and specialized 3D cards that implement
             OpenGL primitives at the hardware level. Until recently
             these advanced graphic cards used to be very expensive
             and only available for SGI stations and other UNIX
             workstations. Things are changing rapidly and thanks to
             Silicon Graphics' generous licenses and driver
             development kit we are going to see more and more OpenGL
             hardware for PC users. Linux users can enjoy this
             opportunity, Yes! A company named 3Dfx Interactive
             provides a series of 3D graphics cards and support for
             the Linux OS through their Glide library. There is
             another article in this series by Phillip Ross (3Dfx
             Graphics Cards) that describes in detail the 3Dfx
             cards available to us. This shows a change of attitude by
             some hardware manufacturers which finally realize that
             the Linux market is here to stay. Linux fans should
             support and encourage this type of initiative.
             To achieve OpenGL's hardware independence, commands for
            windowing tasks as well as commands for obtaining user
            input were excluded. This sounds like it would be a
            serious drawback to using OpenGL, but as we will see later
            (See the GLUT
            Programming series), it is possible to combine OpenGL
            with other flexible programming libraries that will handle
            windowing tasks and obtain user input. Furthermore, OpenGL
            does not provide any commands for describing complex
            models (molecules, airplanes, houses, birds, etc.). In
            OpenGL you will find only the most primitive geometric
            objects (points, lines, and polygons). The developer has
            to construct his/her own models based on these few simple
            primitives. There are OpenGL-related libraries that
            provide more complex models, and any user can use these
            libraries to build their own.
             In our series of articles about OpenGL programming we
            will use the C interface for OpenGL because this is the
            most popular. However the reader should be aware that
            there are bindings available in other languages:
            FORTRAN, C++, Ada and Java. Later in our series,
            after the reader is familiar with the C interface for
            OpenGL we will say something about Open-Inventor, a C++
            library extension to OpenGL.
             Without going into too much detail, the following
            describes some of the features OpenGL implements:
 
Geometric Primitives Allow you to construct mathematical descriptions
of objects. The current primitives are: points, lines, polygons, images
and bitmaps. 
Color coding in RGBA (Red-Green-Blue-Alpha) or in color index mode. 
Viewing and Modeling permits arranging objects in a 3-dimensional
scene, move our camera around space and select the desired vantage point
for viewing the scene to be rendered. 
Texture mapping helps to bring realism into our models by rendering
images of realistic looking surfaces on to the faces of the polygon in
our model. 
Materials lighting is an indispensable part of all 3D graphics.
OpenGL provides commands to compute the color of any point given the properties
of the material and the sources of light in the room. 
Double buffering helps to eliminate flickering from animations.
Each successive frame in an animation is built in a separate memory buffer
and displayed only when rendering of the frame is complete. 
Anti-aliasing reduces jagged edges in lines drawn on a computer
display. Jagged lines often appear when lines are drawn at low resolution.
Anti-aliasing is a common computer graphics technique that modifies the
color and intensity of the pixels near the line in order to reduce the
artificial zig-zag. 
Gouraud shading is a technique used to apply smooth shading to a
3D object and provide subtle color differences across its surfaces. 
Z-buffering keeps track of the Z coordinate of a 3D object. The
Z-buffer is used to keep track of the proximity of  the viewer's object.
It is also crucial for hidden surface removal. 
Atmospheric Effects like fog, smoke and haze make images rendered
by computer more realistic. Without atmospheric effects images appear sometimes
unrealistically sharp and well defined. Fog is a term that really
describes an algorithm that simulates haze, mist, smoke, pollution or simply
the effect of air, adding depth to the image. 
Alpha blending uses the Alpha value (diffuse-material value) of
the RGBA code, allowing one to combine the color of the fragment being
processed with that of the pixel already stored in the frame buffer. Imagine,
for example, drawing a transparent light blue window in front of a red
box. Alpha blending allows simulating the transparency of the window object
so the box seen through the glass will appear with a magenta tone. 
Stencil Planes restrict the drawing to certain portions of the screen. 
Display lists permit storage of drawing commands in a list for later
rendering. When properly used, display lists can greatly enhance rendering
performance. 
Polynomial Evaluators serve to support non-uniform rational B-splines.
This is to help draw smooth curves through a few reference points, saving
the need to store numerous points in between. 
Feedback, Selection and Picking features let you create applications
that allow the user to select a region of the screen or pick an object
drawn on the screen. The feedback mode permits the developer to obtain
the results of rendering calculations. 
Raster primitives (bitmaps and pixel rectangles) 
Pixel Operations 
Transformations: rotation, scaling, translations, perspectives in
3D, etc.  As we mentioned, to make OpenGL truly portable and platform independent
it was necessary to sacrifice all the commands that interface with the
windowing system; for example: opening a window, closing a window, scaling
a window, reshaping a window, reading the cursor position; and also with
input devices as reading keyboard input etc.. All these actions are highly
operating system dependent. Originally the GL-library had its own set of
commands for window and peripheral handling but those were IRIX specific
(SGI's UNIX operating system). It is up to the developer of OpenGL to know
their own platform and take care of handling windows with the native platform. 
 Thanks to Mark J. Kilgard from SGI, there is an additional library that
works around this problem. Mark wrote the GLUT-library, a GL utility toolkit
library that substitutes the old AUX library (never mind what the AUX library
was, forget about it!). The GLUT library is freely available.  Like
OpenGL, you can find the source code for GLUT as well as binary versions
for Linux. The GLUT library is platform dependent, and it offers a common
paradigm for the windowing and peripheral devices. Therefore, when an OpenGL
application wishes to open a window for a graphics animation, it uses the
GLUT command set and this takes care of the underlying windowing system.
In a sense, GLUT hides from the developer the dirty details of the specific
windowing systems (X11, windose, Motif, etc..) and lets one concentrate
on the task at hand - the OpenGL code. Another nice advantage of using
GLUT is that it makes your code platform independent. I have personally
written protein and gel simulations that use GLUT and OpenGL and I have
been been able to compile and run then without a problem nor a single line
of machine dependent code in Linux-Intel, Linux-Alpha, or Windows 95. (I
confess I do use windows 95 from time to time ;-)  I strongly recommend
everyone interested in writing OpenGL applications to use GLUT as your
windowing handler.
 Clearly knowing how to use GLUT is as important as learning OpenGL so
in the current LinuxFocus series about
OpenGL we will also include a number of articles that explain, step-by-step,
how to use GLUT and handle peripheral devices comfortably.
 In closing this short introduction, we cannot forget to mention another
of the "Masters of the Universe," Brian Paul, who is steadily and patiently
implementing an OpenGL-like library for Linux named Mesa. At the
moment Mesa only does software rendering, meaning that it is up to the
CPU to perform all the rendering tasks that might otherwise be delegated
to 3D hardware, but Mesa contains hooks that are implemented internally
that allows drivers for accelerated hardware to be written and utilized.
Currently, drivers only exist for Mondello, S3 Virge (Win95 only), GLINT,
and Voodoo 3Dfx chipsets. Thanks to the Voodoo driver (written by David
Bucciarelli) Mesa can reach the same performance levels as expensive SGI
stations, so if you are interested in high performance 3D-accelerated graphics
go and buy a 3Dfx card.
 Finally, I cannot help telling you about a personal experience on my
Alpha-PC (21164 550MHz 164MRam Linux 2.0.32). I use the Mesa library for
a Gel simulation program I am writing. There is no hardware support in
my system for the Mesa library because up to this moment the Glide library
has not been released for the Alpha system (PLEASE HURRY!!!!). Well, when
Phil Ross and I recently compared the performance of his Pentium PC + 3Dfx
and my Alpha PC + Matrox Millennium card we were a bit surprised to see
that my gel animation run as smoothly on my own PC as on his. The OpenGL
demos run even better on my system (of course, those that did not use textures).
In other words, the lack of hardware support for the OpenGL calls was compensated
for by the brute force of the Alpha CPU. To give you an idea of the work
in each of the frames of the gel animation, every frame contained a Gel
structure modeled with tens of thousands of spheres and cylinders plus
all the lighting computations on it. On the PC we couldn't really see a
gel with that many monomers because the computations prove to be too much
for the poor Intel CPU... the Alpha on the other hand, no problem!. I can't
wait to see my Alpha PC with a 3Dfx card and hardware support for Mesa.
           |