РЕДАКТИРОВАТЬ:
Есть ли какие-то готовые библиотеки для этого, которые либо используют SDL, либо работают на Windows, Linux, Mac, iOS и Android?
На данный момент я не уверен, что способ, которым я меняю контексты, является довольно хорошим дизайном, я еще не полностью закончил его. Я просто очень беспокоюсь о том, чтобы тратить свое время. Я использую SDL для управления окнами и обработки событий.
Я в настоящее время оборачиваю SDL (особенно SDL 2) в классах, чтобы управлять этим. Это мои занятия и что они делают:
Во всяком случае, вот пример того, как это работает:
OglWindowContext* context = new OglWindowContext;
// change context's settings
Window window(ipoint2(), idimension2(640, 480), "Test Window",
Window::Resizeable, context, &windowListener,
NULL /* window delegate */);
while(window.isOpen())
{
window.processEvents(); // calls back events to the WindowEventListener
window.draw(); // calls the context's draw method
}
НОТА:
ipoint2 — это 2d точка
И я могу изменить контекст на полпути, позвонив:
window.setContext(new Dx9Context); // or whatever context you would like
Есть ли более простой способ или я должен сказать более эффективный способ сделать это?
Переключение между программами рендеринга не имеет особого смысла на любой другой платформе, отличной от Windows на данный момент, поэтому ваш запрос на поддержку Windows, Linux, Mac, IOS и Android звучит странно. Возможно, вы ищете библиотеку, которая поможет вам быть переносимым в целом?
Чтобы добиться работы с одним или другим рендерером (opengl / d3d) или для достижения переносимости в целом, вам необходимо реализовать некоторый слой переносимости.
По сути, вы могли бы начать с написания двух программ: одна рисует вращающийся куб в OpenGL, а другая — совершенно отдельная, которая делает то же самое с D3D. Затем, напишите третью программу, которая объединяет их:
D3D и OpenGL на окнах практически могут рассматриваться как отдельные платформы, но вы можете выбрать одну или другую во время запуска приложения — выбор, вероятно, повлияет на рендерер, а также на цикл управления приложением.
Переключение во время выполнения также вполне возможно, но, вероятно, слишком много хлопот, чтобы того стоить.
Вы можете заметить, что SDL действительно многое из вышеперечисленного.
Других решений пока нет …