OpenGL большие проекты, VAO-ы и многое другое

Так что я изучал OpenGL 3.3 на https://open.gl/ и я действительно запутался в некоторых вещах.

  1. ВАО-х годов. Насколько я понимаю, они используются для хранения glVertexAttribPointer звонки.
  2. ВБО-s. Они хранят вертеки. Так что, если я делаю что-то с несколькими объектами, мне нужно VBO для каждого объекта?
  3. Шейдерные программы — зачем нам несколько и что именно они делают?
  4. Что именно делает эта строка: glBindFragDataLocation (shaderProgram, 0, «outColor»);

Самое главное, как все это вписывается в большую программу? Для чего именно используются ВАО-ы? В большинстве уроков рассказывается только о том, как нарисовать куб или 2 с жестко закодированными вершинами, так как же перейти к управлению сценами с большим количеством объектов? я прочел этот Я получил немного понимания о том, как происходит управление сценами, но я все еще не могу понять, как связать материал OpenGL со всем этим.

2

Решение

1-Да. VAOs хранить привязки массивов вершин в целом. Когда вы видите, что вы делаете много вызовов, которые включают включение, отключение и изменение состояний графического процессора, вы можете сделать все это на некотором раннем этапе программы, а затем использовать VAO, чтобы сделать «снимок» того, что связано и что нет, на тот момент. Позже, во время ваших реальных розыгрышей, все, что вам нужно сделать, это связать VAO снова, чтобы установить все состояния вершин в то, что они были тогда. Так же, как VBOs быстрее этого непосредственного режима, потому что они отправляют все вершины одновременно, VAOs работать быстрее, изменяя много состояний вершины одновременно.

2-VBO — это просто еще один способ отправить glPosition, glColor..etc координаты для графического процессора для отображения на экране. Идея заключается в том, что в отличие от немедленного режима, когда вы отправляете свои данные вершин по одному с gl*Attribute* звонки, это заранее загрузить все свои вершины в графический процессор и получить их местоположение в качестве идентификатора. Во время рендеринга вы будете указывать только графический процессор (вы связываете VBO идентификатор чего-то вроде GL_ARRAY_BUFFERи использовать glVertexAttribPointer указать детали того, как вы сохранили данные вершин) в этом месте и оформите ваш заказ на рендеринг. Это, очевидно, экономит много времени, делая вещи наверху, и поэтому это намного быстрее.

Что касается того, должен ли один иметь VBO за объект или даже один VBO за все объекты отвечает программист и структура объектов, которые они хотят визуализировать. В конце концов, VBOs сами по себе — это просто набор данных, которые вы сохранили в графическом процессоре, и вы сообщаете компьютеру, как они расположены, используя glVertexAttribPointer звонки.

3-шейдеры используются для определения конвейера — процедуры — того, что происходит с вершинами, цветами, нормалями … и т. Д. После того, как они были отправлены в GPU, пока они не будут отображены в виде фрагментов или пикселей на экране. Когда вы отправляете вершины в графический процессор, они часто остаются трехмерными координатами, но экран представляет собой двумерный лист пикселей. По-прежнему происходит процесс перемещения этих вершин в соответствии с матрицами ProjectionModelView (задание вершинного шейдера), а затем «выравнивание» или растеризация трехмерной геометрии (геометрического шейдера) в двухмерную плоскость. Затем следует закрасить сглаженную 2D-сцену (фрагментный шейдер) и, наконец, соответствующим образом подсветить пиксели на экране. В ядре OpenGL версии 1.5 и ниже вы не имели большого контроля над этими этапами, поскольку все это было фиксированный (отсюда и термин fixed pipeline). Просто подумайте о том, что вы могли бы сделать на любом из этих этапов шейдера, и вы увидите, что с ними можно сделать очень много удивительных вещей. Например, в шейдере фрагментов перед тем, как отправить цвет фрагмента в графический процессор, отмените знак цвета и добавьте 1, чтобы цвета объектов отображались с инвертированным шейдером!

Что касается того, сколько шейдеров нужно использовать, опять же, программист должен решить, иметь их много или нет. Они могут объединить все необходимые функции в один большой гигантский шейдер (uber shader) и включать и выключать эти функции с помощью логического значения. uniforms (очень часто считается плохой практикой), или пусть каждый шейдер делает определенную вещь и связывает правильную в соответствии с тем, что им нужно.

Что именно делает эта строка:
glBindFragDataLocation(shaderProgram, 0, "outColor");

Это означает, что все, что хранится в out объявленная переменная «outColor» в конце выполнения фрагмента шейдера будет отправлена ​​в графический процессор в качестве окончательного основного цвета фрагмента.

Самое главное, как все это вписывается в большой
программа? Для чего именно используются ВАО-ы? Большинство уроков просто
покройте вещи только для рисования куба или 2 жестко закодированными вершинами,
Итак, как можно перейти к управлению сценами с большим количеством объектов? Я
прочитал эту ветку и получил немного понимания о том, как
управление сценой происходит, и все, но я до сих пор не могу понять, как
подключите материал OpenGL ко всему этому.

Все они работают вместе, чтобы нарисовать ваши красивые цветные фигуры на экране. VBOs — это структуры, в которых хранятся вершины вашей сцены (все выровнены безобразно), VertexAttribPointer звонки, чтобы сказать GPU, как данные в VBO устроен, VAOчтобы хранить все это VertexAttribPointer инструкции заранее и отправьте их все сразу, просто связав одну во время рендеринга в основном цикле, и шейдеры, чтобы дать вам больше контроля в процессе рисования вашей сцены на экране.

Сначала все это может звучать ошеломляюще, но с практикой вы привыкнете к этому.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]