Thorium

Thorium was an engine I worked on together with 4 other programmers. The goal was to make a cross platform game engine with one of the newer graphics APIs, our assigned ones being DirectX12 and the PS4. As main reference I used the blog posts of 3dgep, a graphics blog. Together with a set of lectures, I managed to deliver a cross platform renderer capable of rendering models without textures, due to time constraint, more on this can be read in the takeaways and processes.

Group members: 1 graphics programmer, 2 engine programmers and 2 gameplay programmers.
Platforms: Windows
Span: September 2020 - December 2020
API/Engine: DirectX/PS4
Software: Visual studio 2019, Blender, Maya (Babylon export tool), Perforce, Jira, PS4 debug/profiling tools, PIX, Nvidia Nsights.
Role: Graphics programmer

My responsibilities as Graphics programmer:

- Designing and abstracting a cross platform framework capable of rendering on Windows and the PS4 using the proprietary development tools.
- Wavefront model loading.
- Profiling and debugging graphics errors through PIX/Nvidia Nsights/PS4 tools.

Image Context: The custom tools we had during the development of thorium. On the left is the scene hierarchy shown, with on the bottom a console which we could potentially log to.


Takeaways and processes

The main takeaway of this project would be to never try to learn 2 graphics API's at the same time. It was really hard since none of us had ever touched the PS4 or DirectX12, time pressure was at all times high.

I started this journey using the blog posts on 3dgep, a DirectX graphics programmer blog. The blog posts taught me the basics of WinAPI and DirectX. When we started to reach week 6 however I realized that it was time to shift my focus to the PS4 renderer, since I had to learn that from scratch as well. This led me to not only drop the implementation of textures, but also fail to implement everything with performance in mind. In order to accommodate the texture issue we used an asset pack that didn't use them, instead we used vertex coloring, which was a lot easier to implement.

The PS4 development went well. I got the expected output from the tests I ran, however when I wanted to use the renderer on the full project, it crashed due to memory issues. I tried to debug the issue, but due to time constraints I did manage to resolve the issues.

Apart from the APIs themselves the abstraction in the API was barebone, everything was done with preprocessor statements. This was looking back at the learning journey of that block the right choice, since it allowed us to very quickly add cross platform classes to the project. In the Dataflow project I would learn that there are more effective ways to abstract graphics APIs, by abstracting them behind a API agnostic library.

Even though in the end the PS4 did not run as expected due to memory issues and even though the abstraction of the graphics API was minimalistic, I am still happy with the delivered project, in the timespan we had. If I would have had more time to work on the project I would've spend that to debug the PS4 memory issues, to which afterwards I would implement instancing, since our maps were fully tile based.