Переключение из контекста 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 действительно многое из вышеперечисленного.