2D игры и современный OpenGL

предпонятий

Хорошо, так что я собрал до сих пор следующее:

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

Как я вижу 3D (необязательно)

Учитывая эти данные, я вижу, как рисование 3D сложных объектов очень хорошо с современным OpenGL. Вы в основном загружаете кучу объектных моделей (возможно, из Blender или другого аналогичного программного обеспечения) в VBOs с локальными координатами, а затем просто предоставляете каждому экземпляру объекта другой параметр шейдера (смещение) для рисования в мировое пространство.

Проблема /вопрос

В 2D проблемах и приоритетах совершенно разные. Вы не нарисовываете много сложных объектов, вам не нужны сложные матрицы проекций, а много чего и шейдеров намного проще.

Каким будет лучший способ рисовать часто (действительно часто, в основном каждый кадр), изменяя геометрию с помощью современного OpenGL?

В следующем абзаце вы можете увидеть некоторые идеи проблем (проблема с кругом и прямоугольником), которые лучше определяют те изменения, которые меня интересуют.

Мои попытки (необязательно)

Итак, я начал думать, как я буду заниматься рисованием базовой 2D-геометрии на экране:

  • a square: загрузить [(1, 0), (1, 1), (0, 1), (0, 0)] VBO для геометрии квадрата в локальном пространстве, затем предоставить шейдеру фактическую ширину квадратные и мировые координаты и цветовая информация.

охлаждается, выглядит легко. Перейдем к кругу:

  • круг: треугольный веер с ... эх. насколько точность (количество вершин)? для малых кругов точность должна быть небольшой, а для кругов ошибок точность должна быть высокой. Очевидно, что загрузка 1 VBO не может соответствовать всем случаям. Что делать, если мне нужно добавить точность, потому что размер круга будет больше?

Менее прохладно. Давайте перейдем к чему-то чуть-чуть, прямоугольник:

  • прямоугольник: eh. нет «общей прямоугольной геометрии». У вас просто есть соотношение ширины и высоты и все, но каждый прямоугольник, вероятно, отличается, если размер изменяется.

Как вы можете видеть, все идет вниз. Особенно со сложными многоугольниками и еще что-то.

Отсутствует политика кода: P

Мне просто нужен обзор идеи, не нужен код, особенно код C или C ++. Просто скажите такие вещи, как: «сделайте VBO с данными вершин, а затем привяжите его ...».

9 голосов | спросил Shoe 20 SatEurope/Moscow2014-12-20T10:44:04+03:00Europe/Moscow12bEurope/MoscowSat, 20 Dec 2014 10:44:04 +0300 2014, 10:44:04

2 ответа


5

Ваш главный вопрос выглядит следующим образом:

  

Каким будет лучший способ рисовать часто (действительно часто, в основном каждый кадр), изменяя геометрию с помощью современного OpenGL?

В большинстве случаев нет большой разницы между 2d и 3d OpenGL. Графический конвейер имеет одну дополнительную координату Z, которая не будет использоваться так же в 2d, но это о ней.

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

  • Вы можете подталкивать новые вершины, предоставленные процессором, в каждый кадр. (См. https://stackoverflow.com/questions/14155615/opengl-updating-vertex- buffer-with-glbufferdata для некоторых заметок о повторном использовании буферов.)

  • Вы можете нарисовать разные части существующего буфера с помощью glDrawArrays(mode, first, count). Если циклы анимации, возможно, вы можете поместить предварительно вычисленные кадры с разными списками вершин в один большой буфер и нарисовать соответствующую часть буфера для каждого кадра.

  • Вы можете влиять на список вершин с некоторыми другими данными, такими как однородный массив или текстура. В своем вершинном шейдере прочитайте эти данные и примените их соответствующим образом. Это просто другие идиомы для представления данных на GPU и, вероятно, не будут иметь большого значения в производительности.

  • Если у вас много экземпляров одной и той же геометрии (возможно, это зависит от атрибутов), тогда может оказаться полезным glDrawElementsInstanced()

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

И, возможно, ваша анимация может быть выражена как чистые текстуры, причем вся анимация выполнена пикселем по пикселям процессором или предварительно отображена с диска.

В целом, я бы сказал: «Компьютеры бывают быстрыми, сделайте так, чтобы они работали максимально простым способом, что, вероятно, связано с установкой свежих вершин, созданных процессором, в каждом кадре. Затем посмотрите, достаточно ли этого. /Использование ЦП сначала, вторая часть памяти. "

Другой вопрос , перефразируемый: «Каким образом можно рисовать круги и прямоугольники?»

Circles.

  • С помощью тесселяционных шейдеров (или геометрических шейдеров) вы могли сделать вашу геометрию динамической.

  • Вы можете рисовать квадраты, а в вашем фрагменте шейдер - только непрозрачный (альфа = 1.0) в радиусе и прозрачный (альфа = 0,0) вне радиуса. Тогда он пиксель идеален каждый раз. (Сделайте квадратные вершины -1 на +1, а в фрагменте шейдера - что-то вроде outColor.a = dot(coord.xy, coord.xy) < 1.0 ? 1.0 : 0.0;. Могло бы немного сгладить ребро, выглядишь хорошо там ...)

  • Вы можете просто использовать, скажем, 120-треугольный вентилятор. Возможно, достаточно хорошо.

Прямоугольники.

  • Я думаю, вы ответили на свой вопрос, на этот вопрос. То, что вы предлагаете, будет отлично работать.
ответил david van brink 20 SatEurope/Moscow2014-12-20T18:23:36+03:00Europe/Moscow12bEurope/MoscowSat, 20 Dec 2014 18:23:36 +0300 2014, 18:23:36
5

Я не могу сказать, что я эксперт по этому предмету, и в своем проекте (-ях) я больше сосредоточился на 3D-стороне, поэтому моя 2D-сторона довольно проста, как правило, используя вещи, сделанные для 3D-стороны; и, очевидно, моя перспектива находится на игровой стороне, поэтому моя 2D-графика больше касается блатных спрайтов, чем геометрии. С этой точки зрения,

1) Квадраты и прямоугольники довольно просты. У меня есть только одна коробка 1x1 в VBO, которую я использую для того, чтобы все разбить. Я передаю матрицы MVP в шейдер с этим «блоком единиц», и я объединил его с дополнительным масштабированием, чтобы масштабировать поле до правильных размеров. Как вы знаете, вы можете иметь разную шкалу x и y.

В моих целях я подумывал перейти от использования «единицы измерения» к какому-то движку частиц, чтобы blit 2D спрайты, но это уже другая история.

2) Я не очень много работаю с кругами, я просто использую фиксированные VBO с определенным количеством вершин. Но я мог представить, что я мог бы сделать некоторые шаги, чтобы повлиять на количество вершин, нарисованных для круга.

При подключении данных VBO к атрибутам шейдера я использую glVertexAttribPointer. Он имеет параметр шага, предназначенный для использования для чередующихся данных (которые я использую). Но можно было бы использовать его так:

glVertexAttribPointer(..., n * sizeof(VERTEX_DATA), ...);

... выбрать каждую n-ю вершину из буфера, что влияет на количество вершин, нарисованных для круга. Я мог бы создать несколько VAO с одинаковым VBO с разным шагом, влияющим на количество вершин, нарисованных для круга. Я не пробовал это, подумал.

В общем, да, работа с VBOs и, таким образом, делают более сложным настройку процессора на стороне процессора, почему я изучал разные вещи, чтобы настроить на стороне GPU (шейдеры). Тем не менее, согласно этой статье, использование VBOs более эффективно на современном оборудовании, даже если вам нужно много «вмешательства» на стороне процессора:

http://www.quelsolaar.com/opengl_performance.txt

Надеюсь, это поможет вам немного сконструировать & решите свои указания.

ответил MaKo 20 SatEurope/Moscow2014-12-20T12:12:51+03:00Europe/Moscow12bEurope/MoscowSat, 20 Dec 2014 12:12:51 +0300 2014, 12:12:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132