Trying to steal Vray's thunder.
I'm gonna wait for Steam version
Bram Eulaers is an experienced game developer and an environment artist, who worked on a number of big-budget games, but in his free time he’s creating an awesome procedural shooter Gibhard. We’ve talked about the technology that fuels this project and discussed the beauty of retro FPS.
Hi! My name is Bram Eulaers, I grew up in Belgium, and currently live in sunny Southern California. I’ve worked in the game industry for over 10 years, and have worked on various games such as Bionic Commando, Terminator Salvation and most recently on Overwatch at Blizzard Entertainment, where I currently work as a senior environment artist.
Gibhard actually started out as a 2D prototype for procedurally generating good level layouts. Just for fun I threw in some crude FPS controls with simple enemies, and it basically grew from there.
Big influences for me are of course some of the old-school FPS games I grew up with, like Doom, Duke Nukem 3D and Quake. A more recent game that’s been a big influence is Spelunky, which has been a big inspiration for the overall structure of the game. Visually, the artwork by The Bitmap Brothers on games like “Z” and The Chaos Engine has been very inspirational for me.
Well, first of all, GIBHARD is my attempt to make a game by myself in my free time, so I had to figure out ways to control the scope and generate artwork fast. Going for a retro aesthetic helps in cutting corners while simultaneously allowing me to make something visually pleasing.
Basically it allows me to work on the big picture without having to waste time on the tiny details current gen games require. Going with camera facing 2D sprites for a lot of the content has been a huge time saver for me, it allows me to create a lot of content in little time. Sprites don’t need to be modeled, unwrapped, textured, rigged, etc! Especially for creating the enemies this approach helped me a lot. I actually took inspiration from how iD Software made characters on the original doom, by basically creating these awesome clay and latex models, and photographing them from different angles. It took this exact same approach for my characters, but did it all digitally with modern tools, sculpting them in ZBrush and “photographing” them in 3D software!
Techniques like this, of course, drives the style into a very retro direction and getting content out fast like this allows me to focus on what I consider a very big pillar of the game’s visual style: Great visual readability through color and lighting!
Mixing Old School Style With Modern Tricks
What I’m doing in GIBHARD is not treating the old school elements as old school. The game can very much be considered current gen as I’m making full use of realtime lighting and shaders. For example almost all sprites have normal maps attached to them, which actually light them as if they were a 3D object and makes them feel natural in the environment! There was of course a lot of tweaking involved to get the balance just right but I think I got a good grasp on it by now. In the end pixels are pixels, whether it’s next-gen or retro. If you author the content correctly, you can light it correctly and create whatever effects you want. It’s been a lot of fun trying out modern techniques like normal maps and volumetric noise shaders, and applying them on a retro aesthetic!
For the overall ambient lighting in, I actually generate a skylight texture, which gets blurred and is essentially mapped on the whole map using XZ world coordinates for the UV. Using custom shaders and this texture I’m able to create soft lighting that has nice transitions between indoor and outdoor areas. I actually use this same technique to create glowing surfaces like for example lava, it’s essentially a skylight in reverse. The skylight texture is basically a simplified lightmap, that gets generated in real time when the map level is created.
While this largely handles the ambient lighting, I still make use of point lights a lot to make things emit light. I’m running GIBHARD with a deferred renderer which helps a lot in getting good performance with lots of point lights.
Lastly, I’m also getting a lot of use out of emissive materials and glowy sprites. There’s a lot of complex looking lighting effects you can create for an almost free render cost using emissive textures!
Level Generation Algorithm
There’s a lot of elements to the level generation, but I’ll try to keep it simple. The maps in GIBHARD are essentially 2D layouts, which are tile based. Layouts basically get generated on this grid in a sort of tree like structure, with algorithms “growing” rooms and hallways. So there are really no pre made rooms, however because it’s tile based, most of the level geometry does consist out of pre made modular wall, floor and ceiling tiles.
I would not say it’s very similar to No Man’s Sky, which uses true randomness and noise to create geometry, what I’m attempting to do with GIBHARD is create random levels that feel properly designed. It’s more of a procedural designer than a random generator. Each level is still very designed, as I have tight control over a whole lot of parameters that decide what goes into a level, from what items get placed to shapes and sizes of rooms. It’s been a very interesting challenge balancing design and randomness, and translating my own sense for level design into code!
— Bram Eulaers (@Leukbaars) September 22, 2016
The easy answer of course is, keep it simple :). Keeping everything very low poly and low detail helps a whole lot. Next to that I like to optimise as I go… I think there’s a really enjoyable challenge in creating more with less. For example, I do a lot of effects on just a single quad with shaders using scrolling or alpha erosion. It’s amazing what kind of complex looking effects you can create with smart shader setups. Another thing I like to do is spread calculations out over several frames. The enemy movement with collision detection for example is only calculated at about 10 fps, however the enemy graphic sprites are interpolated and move at the full frame rate, so it all looks smooth. This plus the fact that they are rendered as simple sprites, means I can have a huge amount of enemies on screen for little performance cost!
I actually started out modeling them in 3D, but it didn’t feel right with the enemies being sprites. So I basically baked down my 3D models on 2D textures. These older versions you can still see in some older screenshots of the game. For the final version of the weapons, I did so much paintovers and adjustments that there’s little left of the original bakes in them. I found out I got the best results by straight up just painting them as much as possible in photoshop, and actually painting normal maps by hand by picking normal direction colors from a sphere, a technique I use on a lot of other assets as well. This makes sure they always light nicely when you are running through the environment.
Animation wise it’s all done through code, interpolating their positions and using sine waves to create weapon bops. Some guns have glow effects on them as well that are simply done using emissive textures and code driven intensities. Muzzle flash animations are simply done using an alpha erosion style shader effect!
I think hard difficulty is fine as long as it’s fun. It should be fun to die and you should always feel like it’s your own fault you died, or at least it should be very clear to you what happened! It helps a lot too that you also never get to play the same level twice. You can’t memorize exactly where the enemies will be appearing and where all the secrets are located, so even after dying over and over again, it will stay fresh. The game will by default be pretty hard but there are different play styles that can make it easier or harder for you. Trying to speedrun for the shortest completion time will be very hard, whereas a very cautious player who prefers to take cover and shoot from behind corners will have it a lot easier.
My take on difficulty in games? I think a lot of games are a bit easy and often not very challenging, however I really like recent games like Devil Daggers or the Dark Souls series that are very hard but also very enjoyable. Really love this wave of games that are hard, but fair!
I’m hoping to put the game up on Steam for early access before the end of this year! I actually have most of the content in the game already, and I’m currently basically ironing out bugs and polishing up corners. There’s still a lot of balance work to do as well, which will be an ongoing process during early access. I’m very much looking forward to having people try it out and give me feedback!