можно только переместить камеру в opengl без перерисовки сцены? - PullRequest
0 голосов
/ 27 марта 2012

Я создаю очень рендеринг дорогую сцену в opengl (используя объекты буфера вершин), и пока все объекты остаются на месте, я хочу сделать что-то вроде «плавного преследования» объектов.То есть: оставить объекты там, где они находятся, и переместить камеру / точку обзора влево или вправо с определенной постоянной скоростью.В настоящее время я делаю это, вызывая glTranslatef в моей функции draw, а затем код, который перерисовывает все объекты.Это, однако, очень дорого (много объектов!).Есть ли способ просто переместить камеру, не перерисовывая всю сцену?

Ответы [ 4 ]

4 голосов
/ 27 марта 2012

В OpenGL нет камеры. Или, если вы действительно хотите думать, что есть, то вы должны понимать, что «камера» остается в начале координат OpenGL, всегда смотря в одном направлении. Эффект «камеры» моделируется перемещением и вращением всех объектов в мире, а «камера» находится в начале координат.

Так что, если вы хотите переместить «камеру», вам действительно нужно переместить мир (или все объекты в мире). Другими словами, на самом деле нет способа «переместить камеру, не перерисовывая все объекты». Одним из вариантов, если вы действительно хотите, было бы визуализировать сцену с текстурой, которая больше экрана, а затем сместить текстуру вокруг, чтобы имитировать движение «камеры». Обратите внимание, что если вы используете перспективную проекцию, это будет выглядеть очень неправильно. Это будет выглядеть прилично только в том случае, если вы используете ортографическую проекцию.

Тем не менее, звучит так, будто вы рисуете в непосредственном режиме, который является древним и медленным методом. Вы должны использовать современные вызовы отрисовки с шейдерами и объектами массивов вершин / буферов вершин.

3 голосов
/ 27 марта 2012

Я создаю очень дорогую сцену в opengl

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

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

1 голос
/ 27 марта 2012

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

Обратите внимание, что это имеет несколько недостатков:

  • , поскольку восприятие глубины зависит от положения камеры, перемещающей камеру без обновления информации о глубине, может привести к нежелательным и заметным визуальным артефактам, таким как сцена, которая выглядит плоской и т. Д.

  • Вы не можете повернуть камеру, так как тогда визуальные артефакты будут еще более видимыми, или область просмотра может покинуть текстурированное пространство.

Так что, в качестве альтернативы, попробуйте оптимизировать рисование вашей сцены. Есть несколько подходов, некоторые из которых:

  • отбор окклюзии
  • рендеринг плоских самозванцев / спрайтов для удаленных объектов
  • уменьшение глубины обзора
  • с использованием буферов вершин и индексов
  • инстансы
  • и т.д.

Редактировать

Перечитывая ваш вопрос, кажется, что glTranslatef и т. Д. Вызовы могут быть проблемой. В современных приложениях OpenGL (а также в Direct3D) вы сами рассчитываете матрицы (возможно, используете OpenCL, но не , а не glTranslatef и т. Д.), Сохраняете их и передаете их шейдерам для визуализации объектов.

Что может снизить производительность, так это матричные вычисления, если они выполняются при каждом обновлении. Если ваши объекты перемещаются не очень часто, вы можете рассчитывать матрицы только тогда, когда они перемещаются, а при рисовании вы просто передаете их в OpenGL. Для дальнейшей оптимизации вы можете подумать о локальности данных, чтобы уменьшить количество кешей и т. Д., Но это уже очень низкий уровень оптимизации.

Резюмируя ответ: не пытайтесь уменьшить количество обновлений фреймов, а попытайтесь оптимизировать отдельные обновления. Когда «камера» перемещается, вам необходимо обновить представление (то есть перерисовать), и, таким образом, ваш единственный вариант - уменьшить объем работы, необходимой для этих обновлений.

0 голосов
/ 27 марта 2012

Нет, вся сцена должна быть перерисована.

Вызов glTranslatef изменяет матрицу вида модели, которая является первой матрицей, в которую преобразуется ваша геометрия. Изменение матрицы означает, что все, что находится в конвейере после матрицы, будет недействительным, потому что первым шагом будет практически все. Переводя вместо перемещения «камеры», это больше похоже на перемещение всего мира, и камера остается неподвижной.

Кроме того, OpenGL (и видеооборудование) просто не работает так, как вы хотите.

Существует техника, которая называется billboarding, которая используется для визуализации геометрии, которая находится далеко. Геометрия визуализируется в текстуру, которая затем используется в качестве спрайта при рендеринге основной сцены. Пока камера остается близко к точке, где был создан рекламный щит, ошибка является приемлемой (или незаметной). Сцена по-прежнему отображается в каждом кадре, но вы слегка изменяете. Обычно используется для удаленной местности и деревьев.

Билбординг - это не то, на что вы должны обращать внимание при звуках вещей, потому что это довольно сложно понять правильно. Для повышения производительности сначала посмотрите на использование объектов буфера вершин и выборку усеченного конуса.

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