Course Software
Subroutine Libraries
-
OpenGL is a
programming interface for interactive 3D graphics.
We have the man pages on line.
OpenGL implementations
exist for various platforms.
To learn more OpenGL we recommend the book
OpenGL Programming Guide, 2nd (or 3rd) Edition: The
Official Guide to Learning OpenGL, Version 1.1
by Mason Woo, Jackie Neider, and Tom Davis,
Addison Wesley, 1997.
SGI computers have lots of hardware support for OpenGL.
If you have an SGI computer,
you can read the OpenGL Programming Guide
online using the Insight electronic documentation package on the SGI's. Type
"insight &" into an SGI, wait a minute for the program to start,
then find "OpenGL_PG" in the top subwindow and double-click on it.
- Mesa is a free implementation
of OpenGL that runs on Sun with UNIX, Linux PC's, and other machines,
with a variety of graphics boards.
For some boards and drivers, OpenGL is supported mostly in hardware;
for others it is implemented almost entirely in software.
On UNIX and Linux, OpenGL is almost always layered on top of XWindows.
The Mesa README
file is also useful, especially for tips on how to manage
X-Windows color maps.
Mesa can emulate a 24 bit display on an 8 bit one, and that's the way
we recommend using Mesa on the Suns.
Setting up the colormap so this works right is a bit tricky.
If you want the full story, see
the user guide,
and do a find for "glXChooseVisual".
The code we're providing for the assignments
should set things up so that you don't
need to worry about this, however.
Mesa version 1.2.8 is installed in the class lib directory
(/afs/cs/academic/class/15462/) as libMesaGL.a.
This is very old, and we'll probably delete it after assignment 1 is done.
As of 1/29/00, Mesa version 3.1 is installed as libGL.so .
If you link with -lMesaGL, you'll get the former.
If you link with -lGL, you'll get the latter.
We recommend the latter.
See below for linking tips and for a gotcha regarding -lGL on Suns.
-
FLTK is a nice graphical user interface package,
a variant of Xforms (below) that doesn't rely on X Windows.
It is portable to UNIX, Linux, and Windows.
You can go to the
FLTK web site for information regarding
this graphical user interface package. We have a copy of the
FLTK documentation
for your reference as well.
FLTK comes with an
interactive interface design and layout program called fluid.
If you prefer to use some other user interface library, feel free.
We are currently using version 1.0.7 with the patches as of 1/26/2000.
After assignment 1, we plan to support FLTK in favor of Xforms.
-
Xforms is a nice
graphical user interface package layered on top of X Windows.
This makes it fairly UNIX-dependent.
Xforms' official web page is
http://bragg.phys.uwm.edu/xforms,
but as of 1/25/00 that has been down for days,
it seems, so you might want to try a
mirror site in the Netherlands.
Locally, we have a copy of the
Xforms manual.
Xforms comes with an
interactive interface design and layout program called fdesign.
Note that latest release of Xforms is version 0.88 while the currently
installed one is 0.86 .
-
libpicio is a small library of C routines for reading and
writing PPM and TIFF picture files.
Paul Heckbert wrote it.
It is actually just a layer on top of libtiff, a much larger library
written by Sam Leffler for reading and writing TIFF files.
The header file for libpicio is
include/pic.h
from the class directory.
The source to libpicio is in
src/libpicio.
We hope to add JPEG capability to libpicio later in the semester.
Commands
For previewing animation:
-
The xplay program can read PPM and TIFF picture files
and display them at various speeds or single framed.
Paul Heckbert wrote it.
Try, e.g. xplay *.tif .
Sometimes it uses so much memory that the X server bogs down
and thrashes or crashes.
To use less memory / run faster:
-
xplay ??0.tif --- display every tenth frame
(frame numbers ending in 0).
-
xplay ??[05].tif --- display every fifth frame
-
xplay -zoom .5 *.tif --- display pictures half size
-
xplay -depth 8 -grid ??[05].tiff
- will display using 8 bits per pixel (not 24), thereby saving
X server memory,
showing every 5th frame.
-
xplay `cat frame.list` - will display the frames listed,
one per line, in the file frame.list
This program is in the class bin directory;
its source is in src/xplay.
(Bug: as of 2/1/00, on linux, if your tiffs are 8 bit pseudocolor,
not 24 bit (check that with tiffinfo), xplay probably won't work right.
If you create your tiffs with the pic_write or tiff_write routine,
they will be 24 bit.)
-
The animate program in /usr/contributed/bin is also good.
Try it also.
-
If you have Adobe Premiere or some other video editing
software, then you can convert your animation into MPEG or other
digital video format and go to town.
-
mpeg_encode can be used to generate mpeg versions of your animation;
mpeg_play can then display them. This is a pretty fast process and
will allow you to preview your animation even on machines with small
memory.
If the cluster machines don't have this, you could find the source on
the web.
For viewing stills and image processing:
-
display can display many picture file formats.
It does a good job displaying 24 bit pictures.
-
convert is good for file format conversion from the
command-line.
-
xv reads most format and permits interactive cropping,
file format conversion,
and many other functions.
The user interface is a bit clumsy, but it works.
-
On the Andrew cluster, the installed version of xv is quite old
(1992) and will not display a 24 bit picture file using a 24 bit
window; it always converts to 8 bits per pixel.
I therefore do not recommend its use if you're concerned about
image quality.
Use display or xplay some other program instead.
-
(Bug: As of 2/2/00, it appears that xv won't display many TIFF files
properly (it displays them as ASCII files).
Perhaps xv wasn't compiled correctly?
Computing Services says this should be fixed in a few days.)
-
gimp is a nice image processing system for UNIX, if you can find it
-
Adobe Photoshop (PC or Mac) is the best image processing software;
it can do almost anything.
fluid is the user interface design program for FLTK,
and fdesign is the corresponding program for Xforms,
as mentioned previously.
They are in the class bin directory.
I suggest you set your path automatically by putting something like
set path=($path /afs/cs/academic/class/15462/bin)
in your .cshrc to get these programs with minimum hassle.
UNIX Compilation
The include files for Mesa, FLTK, Xforms, libpicio, and libtiff are in
/afs/cs/academic/class/15462/include, so if you compile with
gcc -I/afs/cs/academic/class/15462/include,
your source code can use, for example
#include <GL/gl.h> /* for OpenGL */
#include <pic.h> /* for libpicio */
#include <FL/Fl.H> /* for FLTK */
to include some of the more important include files.
UNIX Linking
The Makefiles we provide will link the starter code correctly on
cluster Sun and Linux machines, so hopefully you won't need to
muck with the following much.
Typical link sequences, if you're using FLTK, are:
on Linux: -lfltk -lGLU -lGL -lX11 -lXext -lm
on Sun: -lfltk -lGLU -lGL -lX11 -lXext -lsocket -lm
on SGI: -lfltk -lGLU -lGL -lX11 -lm
If you're using Xforms as the user interface library instead of FLTK,
then replace -lfltk with -lforms.
If you're linking with the pic_ and tiff_ routines,
then you'll need -lpicio -ltiff as well.
If for some reason you want the old, soon-to-disappear version of Mesa
mentioned above, use -lMesaGLU -lMesaGL instead of -lGLU -lGL.
A quick tutorial on UNIX libraries:
Subroutine libraries come in two forms, .a files and .so files.
When you make an executable, subroutines are ``linked'' to the main
program.
If you compile with -lfoo, the compiler by default looks for the archive file
libfoo.a,
and if it doesn't find it, it looks for the shared object file libfoo.so.
These files are searched for in the list of directories given in -L options
to the C/C++ compiler, then in the directories listed in the shell variable
$LD_LIBRARY_PATH, then in the default directory /usr/lib.
See "man ld" for more details.
When an archive file (.a) is linked, the appropriate subroutines from the
object files (.o) are copied, making your executable larger, but ensuring that
it will always run (on the right architecture).
When a shared object file (.so) is linked, the subroutines are not copied
and compile/link time.
Instead, at run time, the system uses LD_LIBRARY_PATH to find the
.so file and the appropriate subroutines are dynamically
linked into your executable in memory.
This results in much smaller executable files,
but it means that if you copy your
executable to another machine without copying all of the .so's it references,
your program won't run.
The upshot of this is that LD_LIBRARY_PATH must be set correctly or something
is likely to fail.
You'll need the command
setenv LD_LIBRARY_PATH /afs/cs/academic/class/15462/lib:/usr/lib:/usr/local/lib
It's a good idea to put this command in your .login .
On the Suns, if you're using -lGLU -lGL, it's critical that you
list the class lib directory before /usr/lib and /usr/local/lib,
or you'll get Sun's version of OpenGL (from /usr/lib), rather than Mesa's.
Our experience is that Sun's OpenGL doesn't work well on Suns having
only 8 bits per pixel (the colormap is wrong).
You can, of course, check this variable with
echo $LD_LIBRARY_PATH
On an SGI, you'll probably also need
setenv LD_LIBRARYN32_PATH /usr/local/lib32
for shared object files such as libforms.so and libGL.so to be resolved
correctly.
You can get a list of shared object files that a given executable needs
with
ldd <PROGRAM>.
Working on a Non-Cluster UNIX/Linux Machine
If you want to set up so you can program the assignments directly on
a non-cluster machine, without remote login to a cluster machine,
you'll need to do some extra work, namely copy the include files and libraries.
In order to compile code, you'll need the include files.
Copy the include directory hierarchy to your machine.
(We currently have different versions for each architecture, but I think
the differences are insignificant, so copy any of them.)
Then you'll need the libraries for linking.
Figure out what architecture your remote (e.g. home) machine is.
If it's an Intel processor running Linux, then copy the directory hierarchy
in arch/i386_linux2/include.
If it's a Sun Sparc, copy arch/sun4_55/include.
To copy a hierarchy, the easy way to do it is
cp -r source-dir dest-dir
Another way to do it is:
mkdir dest-dir
cd dest-dir
(cd source-dir; tar cfL - .) | tar xvf -
The L option to tar tells it to follow symbolic links.
You'll probably want option this to help grab files that come
from outside the 462 hierarchy such as the header files for libpicio
and libtiff.
If your machine is not a Sun or a Linux machine (an Alpha, say) then
the first thing to do is check the web pages for the libraries above
(Mesa, FLTK, etc) to see if a compiled library is available for your
architecture already.
If not, you'll need to get the source and recompile.
If it was written by someone at CMU and it's used in this course,
you should find the source code in the class src directory.
Documentation
To get documentation via the "man" program, put this
setenv MANPATH /usr/share/catman:/usr/share/man:/usr/catman:/usr/man:/usr/local/man:/afs/cs/academic/class/15462/man
in your .login or equivalent shell initialization file.
15-462, Computer Graphics 1
Paul Heckbert, Feb. 2000