TL; DR: Un moteur n'est qu'une collection de composants réutilisables.
Mur de texte: les jeux stockent une représentation du monde, par exemple vous auriez une entité comme une maison, qui a un maillage qui définit à quoi ressemble sa géométrie et une position.
Maintenant, vous avez probablement plus d'une entité. Disons que nous avons un personnage contrôlé par le joueur et quelques cases. Lorsque le joueur veut se déplacer, vous devez déplacer le personnage et vérifier s'il entre en collision avec des cases. C'est là que la physique entre en jeu. Selon la façon dont la physique est modélisée, le personnage peut simplement parcourir les boîtes, s'arrêter devant les boîtes ou pousser les boîtes.
Attention, cela ne fait que changer l'état interne du monde du jeu.
Ensuite, après avoir calculé le mouvement et la physique, vous effectuez un rendu d'image, par exemple, dessinez l'état actuel du monde sur l'écran.
OpenGL et DirectX sont des API graphiques, ils ne sont utilisés que pour restituer des éléments (par exemple le caractère) à l'écran.
Donc, vous dites essentiellement à OpenGL / DirectX "Je veux dessiner le personnage en position1 et une boîte en position2, et ...".
Bien sûr, il s'agit d'une simplification grossière excessive.
Quoi qu'il en soit, puisque nous ne voulons pas parcourir cette procédure étape par étape tout le temps, nous mettons ces choses dans les fonctions et les classes. Ainsi, nous pourrions avoir une classe physique qui détient toutes les fonctions nécessaires à la simulation physique, ou une classe graphique qui s'interface avec les graphiques api et dessine nos entités. Et voila, nous avons un moteur.