Projects
Blog: The Tale of an upcomming Games and Graphics
Programmer
Like most gamers my age I played Doom and Doom 2 when I
was around 12 or 13.
I also played
Quake when I was in High school and like everybody else spent hours on
the id software
site downloading the demo over dial up. In fact to this day I find these
games immersive, and full of imagination and depth. In the Summer around
a year into undergrad at Berkeley I found myself with a lot of coding
ability and nothing to do with it. I had just finished playing Doom 3
which also knocked me off my feet, and I decided I would get with my
Artist buddy D. Miller and do a game.
That Fall my project proposal was chosen as a class project for a group
of seven at UCB. The proposal was Doom, reconstructed by hand. However in the end we switched projects to an original game called Neverless. It was based on Secret of Mana and Secret of Evermore <--- thus the title Neverless.
The game was a multiplayer version of an RPG engine with sprites and textured quads arranged in patches to make 2d levels.
Below is the main character sprite we stole from Secret of Mana as
seen in that game:
I worked on the asset loading API, it was xml based, and the whole game was written in Python. We have no evidence of this game to date as most of the code was scrapped after the grueling semester of hackery.
I then took it upon myself to start working on the Doom clone as a pet project, and I titled the game Pilgrim after my lineage. Titling pet projects after roots was something I got from Leif Batt one of my best friends. BTW he has an awesome open source project titled Viking on sourceforge.
Going back to Doom I had a bsp tree builder, a map editing tool, textured quads and sprites, animation, and really bad AI.
Here is a game play video:
I then worked in UI for a semester designing an IPhone app for exercise and health tracking/management. We never coded it up but the design was significantly detailed. We were second place in the class project contest.
This is the Poster we did showcasing the design:
The next semester I studied Networks where I built a TCP/IP protocol
implementation from scratch. Cool and fast, and at the same time I was
starting my research in parallel programming working with the PS3. The
goal was to learn the caveats of PS3 programming so we took to
implementing a bunch of large projects. We tried to optimize the MIT
student ray tracing engine Blue Steel. To be honest we did not get far,
but it broke me into PS3 programming. Then I downloaded the Doom source for linux doom. I started to parse the code and constructed a design doc from what I learned. I then did a traditional ray casting version of the engine basing it heavily on John Carmacks code itself, BUT for the PS3 on SPUs.
Here is a video we made for a demo:
If you can't see that here is a FB link.
I also took graphics that semester with James O'brien, current
Siggraph director. We worked on software shading and ray tracing. Also,
we dabbled in Bezier patch tessellation both uniform and adaptive, and
for the final project I was still working on PS3Doom above.
Here are the rt shots from that class with reflection, transmission, and phong
shading:
And here we have the Bezier patch video. The thumbnail is a slide
portraying my work. James O'brien currently uses it in the
UC Berkeley
graphics
class, pretty cool right!:
And if you cannot see that here is the FB link:
I graduated soon after all this and went to Sony Playstation where I worked on the graphics compiler Cgc. We did debugging and feature support. I implemented a capturing compiler extension which is now upgraded and built into GPAD the SCEA graphics profiler and debugger. I also looked at column major support but did not have time to finish it. I was on my way to UT Austin where I would specialize in graphics.
My first semester, I took said graphics, and these are some of my projects.
The first was an impressionistic painting program which used different brush types to bleed a photo through onto a canvas.
This is an impressionist picture of an enemy from Doom 3:
Next was a Ray Tracer actually my second one at that time. I won the class contest for performance optimization.
This picture took 14 hours to render on a core 2 duo, but in general I could beat the fastest time in the class by 7X with my code:
This next one is an attempt at animation, it was supposed to have particles as well, but well, I started late... No worries, I have particle demo coming up later on down the page :-)
Finally, for the final project I wrote an SPU Ray Tracer for which I
have a video showing some of simple stuff being rendered at 720 x 720. I
worked hard on the SIMD shader experimenting with AOS and SOA
techniques. I
did not work on streaming or acceleration structures contrary to my
previous ray tracing work. On Cell it was out of scope for the final
project. I am however still working towards ray tracing fast on Cell. More on that later.
Here are some screens of the shader code for lack my ability to code html properly:
And here is a Video of the Ray Tracer in action:
I then moved on to working with heightfields. I first wrote a heightfield ray caster, which used a 2D KD Tree and a QuadTree. I was baking
off against PBRT, a ray tracer from Stanford, which just tessellates the
whole height field and ray traces with a 3D KD Tree. I came decently
close, but in the end was just happy to be close after a lot of work.
Actually, it was way too much work.
Here is an image identical to mine, for reference. Unfortunately I
don't have my PBRT work any longer:
I work more with heightfields now in my own engine. That work is
coming up below.
In any case I started working at Zebra Imaging, a company which does
static and dynamic holograms and holographic displays. There I did some
optimizations for the graphics pipeline's different caches. I used
Tom
Forsyth's method of cache simulation in order to get a 20% speed up on
render time with vertex reordering. We also experimented with KD Trees, but it seemed they didn't help too much with the static render loads we had. I also worked on system level stuff for the dynamic display including API work and XML backends. GUI work was also in the job description and I did a plenty of that.
Here is a picture of a hologram and Moc up of the dynamic display work done there:
While at Zebra I began another self maintained software project called
Core: The C++ OpenGL Rendering Engine. It is basically an effort towards an indie game engine. I want to make an in door/out door third person shooter. I put in some fractal heightfield generation. I really don't have an artist so I will be using monsters from Turbo squid and 3D Via for the initial demos.
I had a command console and dynamic model loader for objs with textures and lighting, but I use config files now, and my homebrew collada loader. The TODO list is below:
Task Parallelism - Intel TBB
Windowing - add fullscreen support
Input - add mouse release functionality
Camera System - add Quat support
Graphics - Move to GLSL from Cg
Model Loading - Add more extensive collada support to the basic collada loader
Collision Detection - Detect Terrain collisions with vehicles
AI - Move stuff around on the terrain with some intersting interactions
SIMD Lib - test
Terrain
Heightfeilds - add gausian blur to the heighfield gen
Displacement Maps - use Perlin Noise, Hydrolic Erosion, Low Res
Normal Maps - use Perlin, Voronoi, Hi res with smoothing
Textures - use Blend textures with more factors, anisotropic filtering
Lighting - add
Virtual Textures - implement
Radiosity Baked Textures for Complex Scenes - Get some complex scenes and implement the baker
Screen space ambient occlusion - implement
Shadows -
Perspective Shadow Maps, Soft Shadow Volumes - play around with
Deffered Shading - put in a pipeline for this
Forsyth's GPU Cache Optimizer - use the smaller line cache setting
Occlusion Culling - implement the basic version
Animation - get some animated models and build a mocap playback and blender pipeline
Here is the old terrain engine fly though:
Here is the old model loader console in action:
When I left Zebra I started on my Thesis. Here is the abstract:
The Cell processor is an example of the trade-offs made when designing
a mass market power efficient multi-core machine, but the machine-exposing
architecture and raw communication mechanisms of Cell are hard to manage
for a programmer. Cell's design is simple and causes software complexity
to go up in the areas of achieving low threading overhead, good bandwidth
efficiency, and load balance. Several attempts have been made to produce
efficient and effective programming systems for Cell, but the attempts have
been too specialized and thus fall short. We present Jack Rabbit, an efficient
thread pool work queue implementation, with load balancing mechanisms and
double buffering. Our system incurs low threading overhead, gets good load
balance, and achieves bandwidth efficiency. Our system represents a step
towards an effective way to program Cell and any similar current or future
processors.
What we want to do next is a port of the Ingo Wald Cell Ray Tracer to the Job System and see if we can do some of his optimizations and streaming in a simpler way through the model.
While working on my thesis in Summer 2010 I was doing an internship at Sony Playstation again. I worked with the Playstation Move motion controller team where I cranked out new Move interfaces, game mechanics, and other usage scenarios. I worked on particle systems and terrain editing with the Move. The former was a 2 month effort continually changed and honed down to fit the Sony demo mix atmosphere. The latter was finished a day before I left Sony.
As a student it is difficult to bring all your numerous projects to completion. Also school work cuts into personal project time and we are encouraged to focus on our current schedule rather than tighten up old projects. I am still interested in most of these projects especially my Thesis and Core. I will work on them when I can with some prioritization. But PLEASE return here for updates, and if you have suggestions PLEASE email me. Thanks for checking out my project profile, and keep programming!!!