I want to build a 3D game and the engine it runs on from scratch, mainly as a challenging personal project. I have made an engine before, but it performed poorly because I relied too heavily on ray-traced rendering, so this time I want to try a different rendering approach. I am not looking to be talked out of making my own engine; I mainly need a recommendation for the programming language and graphics API. The project would probably target Linux rather than Windows, and I may share the finished game with friends if it gets that far.
5 Answers
One warning from experience: writing the engine can easily consume the entire project. It is very easy to end up with beautifully organized rendering, asset, and math systems without ever making the actual game. Defining a small playable prototype early can help keep the engine work focused on features the game actually needs.
C or C++ would both work well. The more important thing is choosing a compiled language that already has bindings for a graphics API such as OpenGL or Vulkan. C is a reasonable option if you prefer simplicity, while C++ offers more language features.
C++ with OpenGL is probably the most practical choice. C++ gives you plenty of control and performance, while OpenGL has a large amount of documentation and supporting libraries. For a solo project, many of the usual complaints about C++ are manageable.
You could also use WebGPU with WebAssembly and TypeScript for input and browser-side code. That would let you send friends a URL instead of asking them to install a native build, though it adds another layer of complexity and may not be the best fit if native Linux performance is your priority.
I do not know much about that stack yet, but the idea of sharing it through a URL is interesting enough that I may investigate it.
If you want a more modern and difficult route, try Zig with Vulkan, or Odin with a library such as raylib. Odin is designed with this kind of low-level graphics programming in mind, and raylib can provide useful math, model-loading, and windowing support without forcing you to use a full engine.

That is exactly the failure mode I am trying to avoid. The engine is for the game, so I will need to keep the first version limited enough that I still reach a playable result.