Начните с определения того, что вам действительно нужно, из части «обертки» API. Как правило, все очень и очень просто: вам нужны базовые ресурсы (буферы, шейдеры, текстуры, состояние конвейера) и способ использовать эти ресурсы для создания фрейма путем отправки некоторых вызовов отрисовки.
Старайтесь держать любую логику высокого уровня из оберточной части API. Если вы реализуете умную технику отбраковки сцены в этой части API, то теперь вы готовы к дублированию этой логики во всех реализациях бэкэнда. Это много дополнительных усилий, так что будьте проще. Управление сценой должно быть частью высокоуровневой части API, которая использует оболочку, а не часть самой оболочки.
Выберите цели, которые вы будете поддерживать, и поймите их. Трудно написать приличные обертки для «всего», и вам, вероятно, не нужно (возможно, вам также не нужно писать ни одной обертки, как отмечено в ответе Филиппа ). Почти невозможно написать достойную оболочку, если вы не знаете API, который вы собираетесь обернуть.
Оцените состояние вашего API регулярно. Обычно он должен иметь меньшую площадь поверхности, чем нижележащие API-интерфейсы; если вы обнаружите, что создаете типы-обертки один-к-одному для каждой структуры D3D или для каждого вызова функции OpenGL, вы, вероятно, отклоняетесь от курса.
Посмотрите, какая работа прошла раньше. Sokol и BGFX - это API, которые предоставляют уровни агностицизма, которые могут быть полезны для вас и относительно просты для понимания (особенно для первого).