Я реализую в Android и собственном С++ рисование сцены для Android, используя egl 1.1
. В настоящее время используется Android glSurfaceView
, который позволяет мне рисовать в задний буфер, который отображается в конце «onDrawFrame», когда задний буфер и передний буфер меняются местами.
Моя проблема в том, что мне нужно иметь возможность отображать задний буфер и продолжать запись, как будто я не менял местами. Причина такого требования в том, что сцена очень большая, и строить ее каждый кадр невозможно, равно как и ожидание окончания отрисовки — так как пользователю придется ждать слишком долго.
Другими словами, мне нужно строить сцену поэтапно. В определенный момент во время рендеринга я решаю, что пришло время, и вызываю eglSwapBuffers
, который отображает нарисованное содержимое из заднего буфера, но когда я продолжаю писать, очевидно, я пишу в «бывший передний буфер», который не синхронизирован. .. (не содержащий того, что я нарисовал до сих пор).
Насколько я вижу, мой единственный вариант - скопировать задний буфер перед заменой. псевдо:
- Рисовать в задний буфер
- Копировать задний буфер во временный буфер
- Обмен
- Копировать временный буфер в (новый) задний буфер
- Нарисуйте больше объектов в заднем буфере
- И так далее...
Мой вопрос: есть ли способ выполнить шаги 2 и 4?
- Полезен ли
glCopyPixels
в этом случае? пример? - Is
glBlitFramebuffer
?
Или я неправильно подхожу ко всему этому?
Вещи, которые я уже сделал:
- Я попытался изменить
EGL_SWAP_BEHAVIOR
наEGL_BUFFER_PRESERVED
, но это работает только на определенных устройствах (как описано в заметки Хроноса):
Некоторые поверхности позволяют приложениям контролировать, сохраняется ли содержимое цветового буфера.
- Перерендерить сцену в каждом кадре - невозможно. Я много раз читал, что это рекомендуется.