Comience por identificar lo que realmente necesita de la parte de "envoltura" de la API. En general, es muy, muy simple: necesita los recursos básicos (buffers, sombreadores, texturas, estado de canalización) y una forma de usar esos recursos para construir un marco enviando algunas llamadas de sorteo.
Intente mantener cualquier lógica de alto nivel fuera de la parte del contenedor de la API. Si implementa una técnica inteligente de eliminación de escenas en esta parte de la API, ahora está en el gancho para duplicar esa lógica en todas las implementaciones de back-end. Eso es mucho esfuerzo adicional, así que manténgalo simple. La gestión de escenas debe ser parte de una porción de nivel superior de la API que usa el contenedor en lugar de ser parte del contenedor.
Elige los objetivos que apoyarás y entiéndelos. Es difícil escribir envoltorios decentes para "todo", y probablemente no sea necesario (posiblemente tampoco es necesario escribir un envoltorio único, como se señala en la respuesta de Philipp ). Es casi imposible escribir un contenedor decente si no conoce las API que ya va a ajustar.
Evaluar el estado de su API regularmente. En general, debe tener un área de superficie más pequeña que las API envueltas subyacentes; si se encuentra creando tipos de envoltura uno a uno para cada estructura D3D o cada llamada a la función OpenGL, probablemente se está desviando del rumbo.
Mira qué trabajo ha ido antes. Sokol y BGFX son API que proporcionan niveles de agnosticismo que pueden ser útiles para usted y que son relativamente fáciles de entender (especialmente el primero).