Hi all,
I released my first game on Steam back in March 2023 called Cx6. I had been using Defold for a couple years prior. While I was developing that game, I realized that there was a lot I didn’t understand about how game engines work behind the scenes. That lack of knowledge was limiting my ability to incorporate features into my projects that I really wanted to see come to life.
Here are some typical game features that I didn’t understand on a fundamental level, and therefore looked very confusing and foreign to me:
- Shaders of any kind. (GLSL? Uniform precision? Attributes? Weird pre-existing variables like gl_Position? Materials? Lighting? Shadows?)
- 2D and 3D rendering. (OpenGL? OpenGL-ES? Only some versions are supported on different platforms? Rendering pipeline? Depth buffer? Blending? Framebuffers? Render textures? Difference between models, meshes, and sprites?)
- Camera and viewport. (Rendercam is black magic? World, view, and projection matrices? Linear algebra? Screen-to-world and vice versa? How to draw to a specific part of the screen?)
…and of course, much more than that.
To remedy this, I invested about half a year into building my own small game engine that supports both 2D and 3D, using only C99 and OpenGL 4.6. I did not use any other third-party libraries, aside from loading PNGs. The hardest parts were researching, fully understanding, and implementing all of the required linear algebra and modern OpenGL rendering optimization strategies. I also found out just how difficult it is to generalize an engine for many different types of games, and how much more doable it would be to build a custom engine that focused primarily on just one type of game. Some engine design strategies aren’t easily generalizable. Some rendering and game-object-management designs work very well for certain use-cases, others not so much.
While the engine and small demos I created won’t see the light of day outside my private GitHub repositories, I am extremely glad that I took the time to make them. Coming back to Defold after that experience is pretty mindblowing. Everything that used to look like black magic now looks completely doable and understandable. The camera libraries, the 3D workflow, the fancy shader techniques, etc. I can’t help but be embarrassed at how oblivious my old self was to a lot of these fundamental techniques and building blocks. I look at a lot of my old modules and design problems, and I immediately see new and more efficient ways of solving them. I also no longer feel like I have a strong reliance on others to solve certain problems for me through extensions, such as camera math, lighting and shadows, etc. I feel like I’m able to create more interesting things and innovate on what the Defold community has created already.
So anyway, the point of this post is to encourage others to try building a small project or two from scratch, without the use of a pre-existing engine. It really puts you through the grinder and forces you to learn all kinds of highly valuable skills.
Now that I have this extra experience under my belt, I will start my next game project with Defold.