| 
      
        |   |  |  
    
    
    
    
    
     
      |  |  | 
        
         | 3D Graphics (2 / 2)
  Older 3D graphics experiments. Most recent and interesting stuff is on
  the first page .
 
 
 
  
  
   | Old - Some content is 10+ years old, not representing my current thoughts |  
 
Index
 
 
 
  | 
    
     
      |  |  |  | 3d Graphics (1 / 2) ▷ |  
     
    
     
      |  |  |  | 3d Graphics (2 / 2) ▷ |  
     
    
     
      |  |  |  | Work ▷ |  
     
    
     
      |  |  |  | Machine Learning ▷ |  | 
    
     
      |  |  |  | Haskell ▷ |  
     
    
     
      |  |  |  | Rust ▷ |  
     
    
     
      |  |  |  | Physics ▷ |  
     
    
     
      |  |  |  | Compression ▷ |  
     
    
     
      |  |  |  | Web & Networking ▷ |  
     
    
     
      |  |  |  | Meshing ▷ |  
     
    
     
      |  |  |  | Miscellaneous ▷ |  |  
 
 
 
  
  
    Old OpenGL Demos
 
    
    Some of my very first 3D projects. Some of them are quite fun to look at / play with.
    Nothing special of course, but reminds me of the good old days before pixel shaders and GPUs...
    
   
   
   
    |  | 
       Stargate
       
       Demo showing a portal-like effect realized through environment mapping with a moving
       asteroid field in the background.
       |  |   |  
   
    |   |  | 
       Critical Velocity
       
       This one races along a long sine wave track with flares on the sides. It was ported to MacOS by
       my friend Malte Harder.
       |  |  
   
    |  | 
       Explorer
       
       A terrain engine with simple walk, slide and jump physics. The trees are billboards, the terrain
       is textured by a randomly distributed set of tiling textures.
       |  |   |  
   
    |   |  | 
       Trinity
       
       Interactive demo with collision detection. The scene is a fractal
       landscape surrounded by animated water.
       |  |  
   
    |  | 
       Spotlight
       
       That's actually a Direct3D demo, but still pretty old. The demo shows
       a flashlight effect realized with projective textures.
       |  |   |  
   
    |   |  | 
       Sky Cam
       
       Camera on a Bezier spline moves through an environment mapped scene loaded
       from a Wavefront OBJ file with a sky background.
       |  |  
  
   
    Motion Blur
 
    
    This is an old OpenGL project I did around the time where 3Dfx's VSA-100 with the
    T-Buffer 
    was introduced. It's a simple multipass motion blur effect. The demo shows various objects
    in motion and has controls for adjusting the amount of blur.
   
   
   
   
    |  | 
       The sampling artifacts visible on the "trail" are usually not noticeable in motion.
       Obviously it looks better in general when seen in motion.
       |  |   |  
   
    |   |  | 
       Some more of the same, but this time with a few more samples. It's probably not 
       practical for anything but very simple scenes. The code was written with a TNT1
       in mind, with today's pixel shaders and offscreen buffers there are certainly better
       ways to do it.
       |  |  
  
   
    Shadow Map
 
    
    
    This demo renders a scene shadowing everything on everything illuminated by colored spotlights. Direct3D9 and 
    Cg  are used for rendering. Shadowing is done
    by using hardware shadow mapping. To avoid the jagged / aliased look of the shadows, the depth map lookup is done
    with a four sample rotated grid (RGAA). More samples could be taken with a higher pixel shader profile than 
    the currently used 1.1, or more could be accumulated in the already used destination alpha. The lighting part 
    of the demo is a simple per-vertex spotlight plus a projector texture. The RGAA shadowing needs three passes 
    per light (depth map generation, shadow sampling, ambient + spotlight), while the 'normal' version can merge 
    the 2nd and 3rd pass. Win32 related code is done with Shiny .
   
   
   
    |  | 
       When judging the performance, keep in mind that the shown model has nearly 70K triangles, 10MB of texture data
       distributed over 50 individual textures and is rendered with 4x FSAA. Rendering without FSAA, RGAA shadow map
       sampling and a more moderate 10K triangles / 2MB texture data model results in FPS easily above 150 on a GF3.
       |  |   |  
   
    |   |  | 
       Notice the smooth self-shadowing. The light comes from two spotlights. They move on splines while looking
       at another spline. Looks very nice in motion.
       |  |  
   
    |  | 
       Again, cool anti-aliased self-shadowing. Here you can see that the lights are colored, one is slightly red,
       the other one is a bit blue. Creates a very real looking daylight kind of illumination.
       |  |   |  
   
    |   |  | 
       And once again the same thing.
       |  |  
  
   
    D3D9 / .NET Demo
 
    
    I wrote this small demo in C# to evaluate managed D3D9. It displays a fancy version of Rubik's Cube. The
    faces of the cube are glossmapped and have a reflection cubemap applied to them. The lights are using
    per-pixel attenuation. I managed to squeeze the entire setup including the two lights into a single ps 1.1
    pass. It's 'Color0 = (Mask * (Color + Lighting) + (1 - Mask) * Reflection) * (Light1 + Light2 + Ambient) * 2'.
    That takes up all 8 instruction slots plus all four TMUs. It's quite tricky to compute both lights additive
    cause there are only two temp registers, so I was forced to store an intermediate result in the alpha component. 
    The vertex shader needs 34 instructions.
 
   
   
   
    |  | 
       Needless to say that the reflection looks way cooler when the cube is spinning...
       |  |   |  
  
   
    Direct3D Based Quake2 Renderer
 
    
    
    The purpose of this engine was to render Quake2 levels enhanced with all the eye
    candy that is possible years after the original. The renderer is not based on
    the original engine and is completely custom. The lightmaps were replaced with various
    custom realtime per-pixel lighting algorithms. I also wrote a custom ellipsoid based collison
    and physics code (based on this ). The level data is loaded from Wavefront OBJ files. These files are generated
    out of Quake2 BSP files by a custom converter that also performs various pre-processing steps. The
    lighting system supports colored lights, as well as blinking, pulsating and strobe ones.
    Even moving lights on splines and flares with proper occlusion behavior are supported.
    The engine features an realtime in-engine light editor which allows lighting the levels
    in a point-and-click way.
   
   
   
    |   |  | 
       My favourite map Q2DM8 never looked better (Compare  to old renderer 
       on old hardware). All lighting here is realtime with lots of attenuated point lightsources. The bumpmapping 
       is per-pixel normalized to get the crisp and sharp illumination effects on the low tessellated Quake2 levels.
       |  |  
   
    |  | 
       Another render from the same map, lighting same as above. Notice how a low frequency
       texture was added to break the tiling of the low resolution Quake2 textures.
       |  |   |  
   
    |   |  | 
       Some early pictures, running on GeForce 1. The upper left one shows point lights without
       attenuation, the lower right one is a multipass implementation of colored, attenuated
       diffuse pointlights.
       |  |  
   
    |  | 
       I simply like that map. The detailed dot3 illumination adds a lot. I tried to replace the
       cubemap with a faster pixel shader normalization, but that just removed a lot of the detail
       from the scenes.
      |  |   |  
   
    |   |  | 
       Some more nice views and a little bit of colored lighting. The lights in the upper right
       image are moving on splines. One can set them with a simple build in path editor.
       |  |  
   
    |  | 
       Upper two are running on GF1 / GF2, the lower two on GF3. One has to use a lot of passes
       and destination alpha to get the entire lighting equation implemented on a GF1 / GF2 card.
       |  |   |  
  
   
    Simple Ray Tracer
 
    
    This basic ray tracing project uses an XML based scene graph file format. Supported primitives 
    are (in)finite cylinders, spheres, planes, AABBs and capsules. Lighting is phong shading. 
    Colored spot, directional and point lights are implemented. Anti-aliasing is jittered/fixed 
    ordered grid adaptive sub-sampling, other sampling schemes supported as well. Other features are
    shadows, sky boxes and gamma correction. Correct reflections and refraction with Fresnel term and 
    inner-object reflections can be calculated. Rendering is performed adaptively in a separate thread
    so that intermediate images can be displayed asynchronously. For fast interpolated output of these
    images DirectDraw7 is used. Editing the XML scene files can be done with a two computer setup where
    one machine edits the scene and the other automatically previews changes. The Win32 part of the code 
    was written with my Shiny  library.
   
   
   
    |   |  | 
       Phong illuminated scene in front of a sky box background. The adaptive anti-aliasing
       sub-samples the borders of the objects, also the ones that are seen through a reflection.
       |  |  
   
    |  | 
       From left to right: Reflective, refractive and reflective + refractive sphere. The refractive only
       one looks a bit wierd, but that's probably cause there's hardly such a material in the real world.
       |  |   |  
   
    |   |  | 
       Area light source casting soft shadows. The lightsource is sampled by ordered grid jittering. It's
       rather inefficient compared to i.e. a Poisson disk distribution.
       |  |  
   
    |  | 
       Intersecting reflecting / refracting objects, very time consuming to render cause they cause a lot of
       discontinuities which needs heavy sub-sampling to look good. Limiting the ray depth to  much can 
       quickly result in artifacts for such scenes.
       |  |   |  
   
    |   |  | 
       Some old and new test scenes. The refractive spheres use a fast refraction approximation I got from
       Ray Tracing News .
       |  |  
   
    |  | 
       Rotated grid anti-aliasing in action. I tried lots of different sampling schemes like ordered grid
       jittering and poisson disk. RGAA looks pretty good with just 9 samples and is very simple to implement.
       Currently I use Hammersley sampling,  but I dislike the fact that it can't easily generate additional 
       samples.
       |  |   |  
   
    |   |  | 
       The object AABBs used for intersection acceleration. The pink lines are discontinuities
       which get stronger sub-sampling.
       |  |  
  
   
    Indoor Engine
 
    
    
    This is a modular engine using Direct3D8 for rendering. The scene is exported
    from MAX4 and pre-processed by a custom tool. It supports all kind of per-pixel
    lighting and takes advantage of D3D's pixel and vertex shaders. While the geometric
    data itself is in a binary format, the scene files are XML based. The shadows are
    done with shadow volumes. My implementation of them works around the common problems
    by rendering with Carmack's reverse and using an infinite far plane. Basic particle
    systems and flares are featured as well. In the context of this engine I researched 
    on an occlusion volume extraction algorithm that can compute a conservative set of 
    axial occluders with user defined precision. This simplifies further visibility
    computations a lot and makes them depending on the visual complexity of the mesh instead
    of the triangle count.
 
   
   
    |  | 
       Some picture I made while playing around with the attenuation function. I started with a 1D + 2D texture, tried a version with
       vertex color + 2D texture and settled down on just using a dp3 inside the pixel shader to get the effect I wanted.
       |  |   |  
   
    |   |  | 
       Per-pixel attenuation and shadow volumes. In this early version was no bumpmapping. The attenuation was implemented using
       a 1D and a 2D texture. The flares are point sprites handled by the built in particle engine.
       |  |  
   
    |  | 
       Per-pixel normalized bumpmapping in action. The lights are all attenuated pointlights, either static ones or moving
       on Hermite splines. Bumpmaps are in tangent space.
       |  |   |  
   
    |   |  | 
       Particle systems and a nice realtime statistics display in the upper-left corner. The particles were done using pointsprites.
       The little statistics graph can be customized, I used it to show a lot more than just the FPS.
       |  |  
   
    |  | 
       Another picture of a particle system. They can be defined as templates
       in the XML. One system can contain multiple emitters.
       |  |   |  
  
   
    PC / XBox Lighting Demo
 
    
    I wrote this demo as a shadow volume / per-pixel attenuation test for Direct3D. Later
    this one was ported to the XBox by me. Lights move on Hermite splines and shadows are cast,
    with self-shadowing of course. The camera can move freely, no near plane clipping
    artifacts with the shadow volumes.
 
   
   
   
    |   |  | 
       Demo in action with two lights active. Notice how the shadows correctly
       overlap and that i.e. the chair shadows on itself.
       |  |  
   
    |  | 
       Here's one without textures. The attenuation is a simple 1D + 2D distance lookup
       and works well on GF1 class hardware, or even TNT1.
       |  |   |  
  
   
    OpenGL Terrain Engine
 
    
    The engine uses heightmaps for the terrain. The textures are generated 
    procedurally based on terrain height. An octree is used for terrain frustum culling. 
    Shadows are done by raycasting, the sun flare occlusion is also done that way. A 
    detail texture is applied to the terrain. The water is procedurally animated with 
    real geometry waves, a cubemap gives the reflective look.
 
   
   
   
    |   |  | 
       Sun flare overlay, octree subdivision (higher than usual), entire terrain and surface shot with detail texture.
       |  |  
   
    |  | 
       A nice sky box, lots of mountains from a high altitude, long shadows cast by a low positioned sun and just a bunch of shiny water.
       |  |   |  
   
    |   |  | 
       In the upper left are some old pictures, the upper right picture shows the setup dialog. The lower ones are some more 
       recent pictures running on a GF3.
       |  |  
   
    |  | 
       Nice water. You need to see it in motion to really appreciate the effect.
       |  |   |  
  
   
    OpenGL Lightmap Renderer
 
    
    A rather simple OpenGL project. The engine loads Wavefront OBJ models and
    features very basic octree based collision detection and handling. Simple
    shadow light maps are generated on startup.
 
   
   
   
    |   |  | 
       Several images show the octree, one in the lower left shows simple dynamic lightmapping.
       |  |  
  
   
    3D UI Elements
 
    
    A small collection of 3D UI classes. The goal was not to do things
    like an in-engine UI etc., but rather having some ways of displaying online
    rendering statistics as well as tweaking settings on the fly. The
    framerate graph is actually just a generic graph control that adapts
    automatically to ranges. It can also be used to display other statistics
    like state changes per frame.
 
   
   
   
    |  | 
       A framerate graph and two selection boxes. This is an early version of my
       shadow map  program.
       |  |   |  
   
    |   |  | 
       An older version of the graph control. Credits to Jason Allen  for porting it to OpenGL and various non Win32 systems.
       |  |  
   
    |  | 
       A mesh / shader viewer using the same controls. I also ported this to OpenGL and GLSL .
       |  |   |  
  
   
    Vertex Program
 
    
    First hardware shader I ever wrote, a simple water wave animation. The code was written for the
    NV_vertex_program 
    extension. At that time there was no HW support for it and the driver ran it on the CPU.
    
   
   
   
   
    |   |  | 
       Most obvious flaw of the shader is the lack of normals.
       |  |  
    |  |  |  |