В настоящее время мое приложение использует только Direct3D9 для графики, однако в будущем я планирую расширить его до D3D10 и, возможно, OpenGL. Вопрос в том, как мне сделать это аккуратно?
В настоящее время в моем коде есть различные методы Render
void Render(boost::function<void()> &Call)
{
D3dDevice->BeginScene();
Call();
D3dDevice->EndScene();
D3dDevice->Present(0,0,0,0);
}
Переданная функция зависит от точного состояния, например MainMenu-> Render, Loading-> Render и т. Д. Затем они часто вызывают методы других объектов.
void RenderGame()
{
for(entity::iterator it = entity::instances.begin();it != entity::instance.end(); ++it)
(*it)->Render();
UI->Render();
}
И пример класса, производного от entity :: Base
class Sprite: public Base
{
IDirect3DTexture9 *Tex;
Point2 Pos;
Size2 Size;
public:
Sprite(IDirect3DTexture9 *Tex, const Point2 &Pos, const Size2 &Size);
virtual void Render();
};
Каждый метод затем заботится о том, как лучше всего отрендерить, учитывая более подробные настройки (например, поддерживаются пиксельные шейдеры или нет).
Проблема в том, что я действительно не уверен, как расширить это, чтобы можно было использовать один из режимов рендеринга (D3D v OpenGL), которые могут несколько отличаться ...