The reason I'm asking this is because I plan to update my engine to support Direct3D12, Vulkan, Metal and OpenGL 4.5 via GL_NV_command_list only. Right now, my engine supports Direct3D11 and core OpenGL (ES is broken right now), and since so far these APIs seem to be very different than their predecessors after taking a quick look at the basics so I want to write a new interface to handle it... similar to how Direct3D keeps track of it's interface versions.
/* Higher level rendering class */
/* Lower level rendering class */
What am I asking? I'm asking how similar, if not, how different are each API from each other? What I should probably do first is start working on an API as I write some basic code to get acquainted with each API. Start with a triangle, then add a texture, etc. and design my render device and command buffer classes as I learn. But the more I learn, the more I tend to run into some gotchas that make it a bit more of a challenge to write a universal API that the user can choose to your liking.
If you're curious about my engine so far, you can take a look here: https://github.com/blueshogun96/KunaiEngine
And please, don't tell me that I should use UE4 or Unity instead because it's a "waste of time". That's not constructive and I get tired of arguing this all the time because for me, the benefits of having a custom engine greatly outweigh paying for a pre-built closed source one.