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

РЕДАКТИРОВАТЬ: Есть ли какие-либо предварительно созданные библиотеки, чтобы сделать это для меня, который либо использует SDL или работает на Window, 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 действительно многое из вышеперечисленного.

Другие вопросы по тегам