Можно ли сохранить текущий видовой экран, а затем заново нарисовать сохраненный видовой экран в OpenGL и C ++ во время следующего цикла отрисовки? - PullRequest
0 голосов
/ 11 октября 2011

Я хочу знать, могу ли я сохранить растровое изображение текущего видового экрана в памяти, а затем в следующем цикле отрисовки просто нарисовать эту память в видовом окне?

Я строю много точек данных в виде 2D-графика рассеяния в области экрана 256x256, и я теоретически могу воспроизвести весь график каждый кадр, но в моем случае это потребовало бы от меня сохранения большого количества данных. точек (50K-100K), большинство из которых были бы избыточными, так как прямоугольник 256x256 имеет только ~ 65K пикселей.

Таким образом, вместо перерисовки и рендеринга всей сцены за раз t Я хочу сделать снимок сцены в t-1 и сначала нарисовать его, затем я могу нарисовать обновления поверх этого.

Возможно ли это? Если да, то как я могу это сделать, я довольно долго искал подсказки, как это сделать, но не смог найти ничего, что имело бы смысл.

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

То, что вы можете сделать, это визуализировать сцену в текстуру, а затем сначала нарисовать эту текстуру (используя текстурированный полноэкранный квад), прежде чем рисовать дополнительные точки.Используя FBOs , вы можете напрямую визуализировать текстуру без каких-либо копий данных.Если они не поддерживаются, вы можете скопировать текущий кадровый буфер (после рисования, конечно) в текстуру, используя glCopyTex(Sub)Image2D.

Если вы не очищаете кадровый буфер при рендеринге втекстура, она уже содержит данные предыдущего кадра, и вам просто нужно визуализировать дополнительные точки.Тогда все, что вам нужно сделать, чтобы отобразить это, это нарисовать текстуру.Таким образом, вы бы сделали что-то вроде:

  1. рендеринг дополнительных точек для времени t в текстуру (которая уже содержит данные времени t-1) с использованием FBO
  2. отображения текстуры путем рендеринга текстурированнойполноэкранный четырехъядерный дисплей в кадровый буфер
  3. t = t + 1 -> шаг 1.

Вы можете даже использовать расширение framebuffer_blit (которое является основным сЯ думаю, OpenGL 3.0), чтобы скопировать данные FBO в кадровый буфер экрана, который может быть даже быстрее, чем рисование текстурированного квадрата.

Без FBO это было бы примерно так (требуется копирование данных):

  1. рендеринг текстуры, содержащей данные времени t-1, в кадровый буфер дисплея
  2. рендеринг дополнительных точек для времени t поверх текстуры
  3. захват кадрового буфера в текстуру (используя glCopyTexSubImage2D) для следующего цикла
  4. t = t + 1 -> шаг 1
2 голосов
/ 11 октября 2011

Вы можете визуализировать в текстуру тяжелая часть.Затем при рендеринге сцены визуализируйте эту текстуру и поверх меняющихся вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...