Role: Graphics, engine, bug fixing
Reference game: Legend of Grimrock
Game Engine: Aurora
Level Editor: Unreal editor
Isak Morand-Holmqvist and I wrote the engine from scratch during this project, setting up all necessary things to make a game as fast as possible in order for our team to be able to work.
As simple as it sounds, Aurora was first born without the ability to render meshes, so we had to add this quickly.
Just like with normal meshes, we had no way to animated meshes with a skeleton.
Phyiscally based lighting was added along with three types of light sources, directional, spot and point lights. Ambient light was also added, which relies on having a cubemap. With metalness we also have simple "reflections".
In an indoor scene it would look very good with shadows, even simple ones and since we had done it before, it wasn't hard to add to this project.
Combining the lighting, shadows, reflections and tone mapping we implemented some simple PBR.
We had to write a really quick and working, but poorly structured asset manager for this project.
Our very first project that was supposed to use our own engine! Before this project even because we had already agreed that we'd write the engine from scratch, not only to try to have some semblance of structure but also to learn by doing.
Deliverance is more of a tech-demo than an actual game, the point was to make sure our engines had the basics and that our artists, animators and level designers could get a feeling for how working with our engine would be. Deliverance is a puzzle game where the aim of the game is to solve the puzzle in the old laboratory and steal the secret formula.
The biggest challenge in this project was entirely brought on by ourselves technically, because we had stubbornly decided to code the engine from scratch. This led to us not even having a window start when we compile and start the project from day one. Our gameplay programmers were quite inventive though! They prototyped player movement and entering the code mechanic for the game in their own engine while waiting for our engine to be able to render. The best part was that our level designers could work pretty much unhindered in Unreal Engine while we worked on the engine, they could even test the levels with the Unreal visual script system so they weren't blocked.
I had decided already to work with the engine mainly and we had already decided to code the engine from the start, it was only after the project was done that I fixed some gameplay bugs, the game didn't display "Mission Accomplished" when winning the game and there was a bug that caused the game not to be able to be played after the game was won.
I also solved some issues with the menus not scaling properly and being placed strangely in different resolutions.
Initially we set up a window class and opened a window, then we started from the ground up. First a clear color, then simple mesh rendering, then textures. Then we moved on to loading meshes, then onto materials with normal maps, roughness and metalness. Because our poor animators had a lot of animations that currently couldn't be used we focused on getting that to work. Isak and I had previously made some rather ugly, but functional blending before, but we didn't implement it into this project at this point. Isak and I implemented PBR and the game started to look quite good. Finally that we started implementing lighting, directional, spot and point lights. Now with all of this, we actually had something resembling a working renderer, so we could load levels exported from Unreal and see how they looked using our own rendering!
Below is a gallery of some work-in-progress images and gifs related to our work with Aurora.
Discussing with my fellow engine programmer Isak Morand-Holmqvist we realized that we didn't have enough time to set up the structure as we wanted when we also needed to have a finished game in just four weeks.
At this point we had spent quite a bit of the total project time already and we still needed some kind of super basic UI rendering so we could set up a menu. As with many other things during the making of Aurora we made things work, but not very elegantly.
The graphics of the game was further improved when we added shadows for all lights. They weren't the most beautiful, but for now they worked. Eventually I implemented percentage closer filtering for shadows as well which is a simple shadow map anti-aliasing method that can make shadows look better in some cases.
Finally after the basic engine was finished we needed to code a fast and ugly asset manager. A slight mistake that was made was that the different assets didn't use polymorphism and had no base Asset class, but when under duress, things need to be made fast.