Переключение из контекста OpenGL в контекст D3D / DX (или другой контекст) во время выполнения

РЕДАКТИРОВАТЬ:
Есть ли какие-то готовые библиотеки для этого, которые либо используют SDL, либо работают на Windows, Linux, Mac, iOS и Android?

На данный момент я не уверен, что способ, которым я меняю контексты, является довольно хорошим дизайном, я еще не полностью закончил его. Я просто очень беспокоюсь о том, чтобы тратить свое время. Я использую SDL для управления окнами и обработки событий.

Я в настоящее время оборачиваю SDL (особенно SDL 2) в классах, чтобы управлять этим. Это мои занятия и что они делают:

  • Окно — Описывает окно
  • WindowContext — Описывает контекст для окна (абстрактный класс)
  • WindowDelegate — Используется для определения того, когда контекст изменился, когда окно откроется / закроется и т. Д.
  • WindowEventListener — Прослушивает события из окна (не уверен, стоит ли просто придерживаться опроса вместо функций обратного вызова)

Во всяком случае, вот пример того, как это работает:

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

Есть ли более простой способ или я должен сказать более эффективный способ сделать это?

1

Решение

Переключение между программами рендеринга не имеет особого смысла на любой другой платформе, отличной от Windows на данный момент, поэтому ваш запрос на поддержку Windows, Linux, Mac, IOS и Android звучит странно. Возможно, вы ищете библиотеку, которая поможет вам быть переносимым в целом?

Чтобы добиться работы с одним или другим рендерером (opengl / d3d) или для достижения переносимости в целом, вам необходимо реализовать некоторый слой переносимости.

По сути, вы могли бы начать с написания двух программ: одна рисует вращающийся куб в OpenGL, а другая — совершенно отдельная, которая делает то же самое с D3D. Затем, напишите третью программу, которая объединяет их:

  • Абстрактное отличие двух приложений от общего интерфейса
    • Например, но не ограничиваясь этим, когда вы попадаете на различные платформы:
      • Цикл управления приложением
      • Рендерер (т.е. вывод графики)
      • Файловый ввод / вывод
      • Пользовательский ввод
      • аудио
      • Системные сервисы (темы и т. Д.)
  • Реализация общих интерфейсов на всех целевых платформах
  • Реализуйте функциональность приложения только через интерфейсы абстракции

D3D и OpenGL на окнах практически могут рассматриваться как отдельные платформы, но вы можете выбрать одну или другую во время запуска приложения — выбор, вероятно, повлияет на рендерер, а также на цикл управления приложением.

Переключение во время выполнения также вполне возможно, но, вероятно, слишком много хлопот, чтобы того стоить.

Вы можете заметить, что SDL действительно многое из вышеперечисленного.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]