This is a direct continuation of the first and second parts. Let this partial quote from there serve as an introduction:
This series (hopefully) of blog posts will gather and shortly describe some previously unreleased and/or forgotten projects I’ve worked on over the past decade and a half, starting from 2000. This is by no means a complete listing, I’m still skipping over the vast majority of unfinished ideas and half-baked projects, but I’m trying to include everything which worked to an extent or has some interesting features.
The primary purpose of this is to serve as an archive for myself, because, as you will notice when I go through the list, I’ve already lost a lot of somewhat interesting stuff and would rather not have that happen again. Perhaps one thing or another might also be useful to someone else, but I obviously won’t troubleshoot code I wrote more than a decade ago and haven’t touched since then! And, just to make that clear, it’s also obviously not indicative of my current skills.
I started this series of posts at the beginning of the year, and resolved to do at least 3 before the end, so that’s why this is happening now. The previous two iterations together went up to the end of 2006, covering a lot of abortive game attempts, a released PSP game and some useful tools.
GPU-based Image Processing and Multigrid Solvers
Around that time I had already implemented my bachelor degree project, and relatively shortly later (well, 2 years, but who’s counting) – and it’s highly related, so I’ll include it here – my master degree project.
These projects together ran roughly from 2004 to 2007, and there was no specific GPU computing API at all until their very end. People were just starting to experiment with doing compute on graphics cards using standard graphics APIs, and so everything I worked on during these projects I did in OpenGL. So, my first step was to create a library which makes it easier to do compute on what is essentially a graphics platform:
Based on that, during my bachelor work I implemented a lot of image filters, from simple stuff, over arbitrary convolutions, up to non-linear/anisotropic image filtering like Perona-Malik diffusion.
To gather and evaluate a good amount of data on all the GPUs popular at the time, I created a benchmark which reported various performance metrics and released that on Beyond3D. Other programs created were a testing environment for filter development called “ftest” (my naming sense strikes again) and even a C# GUI for comparing various data and generating charts. I lost the source for the latter, but I still have the former. In fact, ftest has no issue running on my current Windows 10 system – not bad for a binary compiled over 10 years ago (no guarantees on this one of course!):
For my master thesis in 2007 I implemented a multigrid solver for elliptic PDEs using the same framework. I won’t go into too much detail since this is getting kind of long already and we need to get back to the games! In case you are interested, here’s my master thesis.
Muh aka Project Y aka YouMUH!
This is a long story, spanning all the way from 2008 to 2012. This doesn’t mean that I worked on it for 4 years of course, just that I spent a few days on it from time to time, often with months between them. The basic idea for this game was to be a 2.5D side-scrolling platformer/action game starring Youmu Konpaku (who is in the logo of this blog by the way, and has been since its inception. I guess I always thought I’d talk about this project some day).
In any case, looking back on it now, the “game” seems to have been mostly an excuse for me to play around with whatever rendering, modeling or physics technology I was interested in at the time. That doesn’t mean that I didn’t have some idea for how the whole thing would play when it was completed (something like a mixture of Koumajou Densetsu, Bunny must die, and Noitu Love 2), just that completing it never seemed to be the point.
I started working on modeling for the game in 2008, with just a sword in Wings3D. During 2009 I spent a significant amount of time learning Blender and modeling/animating the main character. In 2009 I started with the actual coding, putting a lot of work into implementing deferred shading with a non-photorealistic art style. I created a cross-hatch shading algorithm which was based on a set of consecutively darker hatched base textures. The result looked like this:
Subsequently, I spent far too much time with cloth simulation. At that point, this was still uncommon (nonexistent?) in games, and I basically created everything from scratch, starting with the physics simulation, over collision, to the file format used to specify cloth type/behaviour. It was an addition to the .obj file format and looked like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# Muh! cloth spec (Youmu skirt) ~ skirt 3 18 0.8 1.2 + repel 18 0.0006 1.3 + repel 13 0.0006 0.9 + repel 8 0.0006 0.6 + repel 3 0.0006 0.3 / vadjust 0.0 -3.276 0.1 / vadjust 0.0 0.004 0.0 / bonefix body v -0.360194 2.939784 -0.031599 v -0.174628 2.938775 0.190169 v -0.312241 2.939084 0.124392 v -0.312176 2.940459 -0.187843 v 0.171313 2.940701 -0.243591 v -0.001426 2.940715 -0.258449 v -0.174184 2.940714 -0.255306 v 0.309338 2.940458 -0.181998 v 0.357355 2.939784 -0.030932 v 0.309400 2.939084 0.124392 v -0.001420 2.938720 0.207231 v 0.171787 2.938775 0.190169 v -0.348320 2.940155 -0.116461 v -0.251533 2.938884 0.166926 v -0.348315 2.939406 0.053451 v -0.251242 2.940635 -0.232453 v 0.248385 2.940628 -0.222419 v -0.089667 2.940727 -0.261419 v 0.086805 2.940719 -0.254054 v 0.345485 2.940156 -0.113792 v 0.345474 2.939406 0.053451 v 0.248692 2.938884 0.166926 v -0.089964 2.938728 0.203239 v 0.087123 2.938728 0.203239 f 4 13 f 1 13 f 3 14 f 2 14 f 3 15 f 1 15 f 4 16 f 7 16 f 8 17 f 5 17 f 6 18 f 7 18 f 6 19 f 5 19 f 8 20 f 9 20 f 9 21 f 10 21 f 10 22 f 12 22 f 11 23 f 2 23 f 12 24 f 11 24 |
It was quite insane, but it worked out not too terribly in the end. I extended the same physics system to handle bone animations (this part worked well) and tried to also go for hair (this didn’t work well). You can see a video of the state ~2011 here. At that point, I had also switched to a more traditional cel shaded look (a decision which I would revert today).
During all this time I continually refined the running animation, and looking back at the initial one and the final version I have to say that at least this was a clear track of improvement. The last things I worked on, some time in 2012, was level loading, where again I used a custom format, but at least it was XML-based. This is the final state of the project at this point:
Basically, once I got a level loaded (with no materials mind you) I realized that, as a single developer, doing the entire game at a level of graphical sophistication which does the effort I put into just the main character’s skirt and running animation justice would be utterly infeasible. At the same time, doing it any lower level wasn’t going to make me happy, and just doing things again for which I already had a “proof of concept” so to speak would be boring. So, at that point I shelved the project — and a bit later started to work on DSFix, which turned out to be a lot more helpful to far more people.
Nonetheless, I learned a lot doing YouMUH! over the years, including:
- Modeling and animation in Blender (and that I’m not great at it)
- Deferred shading
- Some approaches to non-photorealistic rendering
- Physics simulation (particularly cloth/hair)
- Some of the problems that come with trying to integrate neat state-of-the-art code with, well, art
And also, that it’s not a good idea to attempt a medium-fidelity 3D PC game (with bleeding edge features like cloth simulation and NPR) while doing almost everything from scratch and also handling all the code and art on your own. Well, it’s not a good idea if you want to finish something, it’s pretty nice as a hobby and for learning things!
That’s it for this iteration. There’s still one more project I’ve never posted about that I consider significant, and a few smaller ones. But I really wanted to at least reach the 2010s before 2015 is over!