Как игры движутся вокруг объектов (в общем) - PullRequest
3 голосов
/ 09 июня 2010

Я уверен, что есть не только один ответ на этот вопрос, но игровые движки действительно меняют векторы в памяти или используют gltransformations? Потому что нажатие и выталкивание матрицы все время кажется неэффективным, но если вы продолжаете изменять вершины, вы не сможете использовать списки отображения. Поэтому мне интересно, как это вообще делается. Спасибо

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

Зависит от ваших целей / объектов.

Объекты, которые никогда не меняются, перемещаются путем установки матриц (это можно сделать с помощью glRotatef / glTranslatef и тому подобное).Это, конечно, быстрее, чем преобразование вершины объекта в вершину.Объект хранится в DisplayList, VertexArray или в VBO.Вы МОЖЕТЕ отправить каждый объект целиком каждый раз, используя команду glVertex *, но если объект никогда не изменяется, в этом нет необходимости.

Символы (скины / фальсификации) преобразуются с использованием нескольких матриц, которые обычно обрабатываются вершинным шейдером,Вы можете сделать это на CPU, если хотите, но если у вас нет ОЧЕНЬ продвинутого механизма такелажа / скининга, в этом нет необходимости.

Вычисления, которые не могут быть полностью выполнены на Videocard, выполняются на CPU.Обычно это системы частиц, ткань и процедурная геометрия, иногда тени (для расчета объема тени с использованием трафаретных теней).Такие объекты обычно сохраняются в памяти, по крайней мере частично, и преобразования выполняются на процессоре.Это строго зависит от оборудования.В зависимости от мощности видеокарты и версии OpenGL можно выполнять некоторые или все эти задачи на видеокарте (без использования ЦП), но не всегда.Например, обычно невозможно построить теневой объем для процедурной геометрии (т. Е. Топология варьирует каждый кадр, а также положение вершин) в графическом процессоре.Однако есть способы избежать этого, и ситуация может измениться в будущих версиях.

3 голосов
/ 09 июня 2010

Есть много способов сделать это в зависимости от игрового движка.

Но, вероятно, наиболее распространенный подход - это разделение обязанностей между игровым движком и видеокартой, что-то вроде следующего:

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

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

  • Затем выполняются вызовы OpenGL для рисования необходимой сетки) с glDrawElements (при условии, что вы используете объекты буфера вершин).Это означает, что все преобразования, необходимые для отдельных вершин сетки, выполняются графическим оборудованием.Поскольку сотни отдельных примитивов могут быть эффективно нарисованы с помощью одного вызова OpenGL, это может быть очень важно для производительности.

1 голос
/ 09 июня 2010

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

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