Here’s an update on the graphics engine I am building for my last class at DigiPen. Model loading, MTR managing, camera controls, texture managing and fragment/vertex/geometry shaders are all handled by yours truly. One focus I had on this particular engine was setting up a fast/user-friendly post processing system. I’v implemented a system of string-recognized render buffers and post processing fragment shaders that can be chained along to stack post-processing effects until you’ve reach your final picture. Instead of drudging through having to bind FBOs, igniting shader programs and sending uniforms etc., this allows the user to simply say… PostProcess( "MyScene", "ToneMapShader", "MyHDRScene" );. Where “MyScene” is the name of the render target you want to be shaded using “ToneMapShader” and then store the output into “MyHDRScene”. All that is required is an offline step where the user verifies all that is needed by the shader.
Also by going through my system, instructions to GPU are saved by only updating the graphics pipeline when necessary. I can keep track of the current GPU state and thus save time such that if someone wanted to use the same texture sampler on TEXTURE2′s unit there’s no need to re-bind the texture thus saving communication time on the slow bus between CPU and GPU. This can save loads of time and any good graphics engineer needs to be weary of GPU state changes; especially changing shader programs which my system also handles.
This demonstration is ready to run on an Nvidia 6600GT.
Extra Features in Demo:
Beside self-shadowing parallax, I was able to get global shadow maps to work with the parallax occlusion. Because parallax mapping actually takes place on flat geometry, depth comparisons with the light buffer will conclude that something parallaxed is in shadow when it really isn’t; this causes “floating” shadows where no matter how steep the parallax-occlusion becomes, the shadow test still determines shade with the flat piece of geometry. I modified the G-Buffer such that when an object is using parallax-mapping, I alter it’s world-space position in the G-Buffer. This is easy to do via shaders by simply moving the world-space position along the object’s normal*parallax_value.
Deferred Lighting
Steep Parallax Mapping with Soft Shadows
Variance Shadow Maps
Screen Space Motion Blur





looking really sharp…
Daaayaaamn duuuude!!! This shit’s looking fucking awesome. Nice job!