Make your own free website on

OpenGL Demos

Menger Sponge -- I used a really old povray scene file that recursed a Menger Sponge into polygons and ported it over.  I used some simple alpha-blending to give it a little more eye-candy.  Keys : "a" and "s" rotate about x-axis.  "e" and "d" rotate about z-axis.  "i" and "k" translate along z-axis.  "+" and "-" control detail.  Note that the algorithm to compute the sponge is recursive, so beyond a certain amount of detail, and it is likely to crash with a stack overflow. "\" restores the window to 512x384 (which I needed because I was dumping the files to animations). Executable.

Radial Moire -- This is a simple extension on an old-fashioned trick using interference.  There's a set of lines going outward radially from a point, and you cross over 2 or more such sets with alpha blending.  In this case, I'm doing 4 sets of lines and having them move about with respect to each other.  The result can be rather disorienting after a while, though.  This uses the skeleton code written by OTri for "The OpenGL Challenge" but is not an actual entry.  I just made a minor modification so that the actual visible dimensions of the window were 512x384.  ExecutableSource Code.

Swirling Lightning -- A very cheap and simple trick involving skewed perspective.  Upon first appearances, it may be hard to believe, but it's really just a rotating cube.  The perspective transform however, makes you see a very wide angle, including areas behind you.  Simple, cheap, and fast, but effective.  A fairly good texture for such a purpose as well.  Detailed, but no sharp edges, so that the bilinear interpolation in hardware doesn't do any harm to the quality.  Again using OpenGL Challenge skeleton code. ExecutableSource Code.

Swirling Plasma -- Pretty much the same routine as the lightning.  Different texture, and using a GLUQuadric object.  This one also has a simple little fade from white at the very beginning.  In my Sounds & Visions piece for 2002, I had this animation following one that ended in a bright glow whiting out the screen.  Thus, the fade from white, which was simply done as an alpha-blended quad that covered up the camera.  Again, appearances deceive, but this is actually just a textured sphere.  There are times when you can see both poles of the sphere due to the wide 270-degree field-of-view.  Executable. Source Code.

Water effect -- Everybody and his brother seems to have done this one.  I guess I'm no exception.  Basically uses the same computation we've done in 2-d water effects.  Instead of generating a warp-map, it generates a heightfield.  The heightfield is re-rendered every frame and there's the water.  The raindrops are just an added touch.  Instead of randomly inserting splashes, I have these raindrops fall from random places and just generate a splash whenever their y-values reach the height of the water plane.  Executable.

Virtualdub plugins

Adaptive Subsampler v2.05 -- I made some variations to the Adaptive Subsampler.  The old version used differences to decide whether or not to perform linear interpolation.  This is an algorithm often used to accelerate raytracing or hemicube radiosity, so it is still useful (i.e., compute pixels explicitly if thresholding fails, and use linear interpolation if it passes).  However, this is not very effective on animated media.  I made a variation that globally smooths, but the averages are weighted on differences rather than decided.  This is especially tuned for animated video and not suitable for live action.  Example images are available here.  As a result, version 2.0 is completely different, with a different interface and so on (thereby warranting the "2.0" moniker).  And far more useful for actual video processing.  There are a good deal of variations derived from the "Smart Smoother" for vdub.  In particular, interface because I'm not so good with Win32.  More importantly, the checking against grayscale. v1.0 is still available, as well as the source code (which you can study from for your next raytracer).
Version history :
v0.95 : Initial working version.
v1.0 : Sylia scripting bugfix for batch jobs.
v2.0 : Modified algorithm using weighted averages.
v2.02 : Dealt with some redundant calls, reduced cache misses, reduced memory fragmentation, and a host of other optimizations. Approx 7-8% faster than v2.0, but also uses about 10% less memory.
v2.05 : A few more optimizations and recompiled with Intel compiler, which didn't really do a whole lot for speed, but significantly shrunk the file (from 85k to 32k). This filter turned out to be a poor candidate for vectorization, which clearly shows a need for hand-optimized low-level code. Overall, about 12-15% faster than v2.0.
Source code for version 1.0 is available for this plugin in a Visual Studio 6.0 workspace.  (Included are the headers for the Virtualdub filter SDK)
Binary version 1.0 zipped.
Binary version 2.05 zipped.

Fading subtitler v1.10 -- A useful plugin for a fansub group I'm working with.  This is a modification on Avery Lee's original SSA subtitler for Virtualdub.  It will take a script from Substation Alpha and fade the subtitles in and out when rendering.  The primary difficulty proved to be the fact that the code for the original subtitler was not very extensively commented and there was a great deal of unnecessary passing from class to class with some otherwise useful portions of data left out.  For the most part, it required only minor changes to achieve fading as far as adding a few data elements to the rendering info classes and passing alpha values back and forth and finally to the rasterizer.  Currently, the fading functionality is confined to the useful range of operation (e.g. subtitles that are not anti-aliased do not fade)
Version history :
v0.9 : basic alpha blended antialiased subtitles.
v0.93 : Fading in at constant speed.
v0.95 : Modifications to the RenderItem class.  Fading in and out at constant speed.
v1.00 : First really usable version with user interface modifications so user controls fade-speed.
v1.05 : Bugfix in the Sylia script writer.  Plugin supports proper configuration saving so that it can be used for batch jobs.
v1.10 : Supports fading of all kinds of subtitles including shadows.  Also has a radio selection so that you can fade based on whether subs have borders or not (or fade all subs).  Note that shadows are counted as "borders."
Example encode (240x176 MPEG-1 Low quality).  "Labyrinth" by ALI Project, ED video to St. Luminous Jogakuin.
Binary zipped.


Jpeg Animstream Dumper -- This is what I've used to dump the frames of OpenGL demos to a stream of numbered jpegs.  After that, I'd use something like Bink to convert the numbered JPG's to an AVI file.  Because school lab machines didn't give us access to the Video-For-Windows API, I had to use Intel's Jpeg Library.  The code isn't very optimized, but the real point when I wrote it was to get it working as soon as possible. (Link points to a Code-of-the-day entry on Flipcode).

1-D Generalized Wavelet class -- I'd been doing research in my spare time on using wavelets in audio compression.  This is code I wrote for a generalized 1-d transform which I can control to use any wavelet or wavelet family up to about 10th or 12th order.  The speed is really quite good, but in wavelet compression techniques, most of the time is eaten up by what is done with the wavelet transform.  From this code, it's also possible to create 2-d as well as 3-d separable transforms as well.

Volume Light Rendering effect -- This was actually an old technique I'd used back in the days of software rendering (IIRC, my first implementation was done in Pascal back in '93).  It's a cute little point-to-surface volume extrusion that steps along the texture coordinate axes.  This is a version I wrote into a Torque Game Engine class and contains both an OpenGL and a DirectX 9 codepath.  The resource was posted to GarageGames and has now been formally recommended for the Torque Lighting Pack.