Вы можете создать интерфейсный класс, который позволит вам расширять API, на который вы надеетесь расширить.
Я делал это в прошлом, чтобы создать DirectX9 \ 11 Renderer, и я надеюсь в скором времени расширить его до OpenGL. В этой задаче есть много уверенности, но ее простую работу легко объяснить. К сожалению, проект, на котором я работаю, является закрытым, поэтому, если у вас есть какие-либо вопросы по этому поводу, пожалуйста, не стесняйтесь спрашивать.
Сначала вы захотите создать отдельный проект для использования в качестве .lib / .dll, я назвал это «RenderInterface». Он будет содержать базовые интерфейсы для VertexBuffer's, IndexBuffer's, Shaders и, что наиболее важно, IRenderInterface и IRenderUtility, которые в более поздней реализации могут потенциально содержать такие элементы, как, например, ID3D11DeviceContext и ID3D11Device.
Моими двумя наиболее важными элементами в проекте «RenderInterface» являются IRenderInterface и IRenderUtility. Идея заключается в том, чтобы IRenderInterface выполнял тяжелую работу, такую как создание целей рендеринга, представление и инициализация API. В то время как IRenderUtility будет выполнять более общие задачи, такие как создание буферов вершин / индексов, создание шейдеров и рендеринг. Я чаще передаю IRenderUtility при инициализации и рендеринге, а IRenderInterface редко передается. Это сделано для того, чтобы пользователи не могли выполнять случайные операции, когда им это не нужно. Этот проект также будет включать некоторые распространенные структуры \ enums, которые будут использоваться во всей базе кода.
Затем я создаю другой проект, такой как D3D11RenderInterface. Этот D3D11RenderInterface будет иметь реализации IRenderInterface, IRenderUtlity, IVertexShader, IVertexBuffer и т. Д.
Слишком простой пример:
class IRenderUtility
{
public:
virtual void Draw(unsigned int vertexCount, unsigned int vertexStartOffset) = 0;
};
class D3D11RenderUtility : public IRenderUtility
{
protected:
ID3D11DeviceContext *mD3D11DeviceContext;
public:
void Draw(unsigned int vertexCount, unsigned int vertexStartOffset)
{
mD3D11DeviceContext->Draw(vertexCount, vertexStartOffset);
};
};
Это работает, когда VertexBuffer и IVertexBuffer устанавливаются посредством вызова IRenderUtility перед вызовом IRenderUtility :: Draw.
Тогда в вашем приложении нужно будет только загрузить проект RenderInterface и реализацию API. Есть и другие способы сделать это, например, # определение кода по всей вашей кодовой базе, но imo, это просто грязно.