Так что я изучал OpenGL 3.3 на https://open.gl/ и я действительно запутался в некоторых вещах.
glVertexAttribPointer
звонки.Самое главное, как все это вписывается в большую программу? Для чего именно используются ВАО-ы? В большинстве уроков рассказывается только о том, как нарисовать куб или 2 с жестко закодированными вершинами, так как же перейти к управлению сценами с большим количеством объектов? я прочел этот Я получил немного понимания о том, как происходит управление сценами, но я все еще не могу понять, как связать материал OpenGL со всем этим.
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 ко всему этому.
Все они работают вместе, чтобы нарисовать ваши красивые цветные фигуры на экране. VBO
s — это структуры, в которых хранятся вершины вашей сцены (все выровнены безобразно), VertexAttribPointer
звонки, чтобы сказать GPU, как данные в VBO
устроен, VAO
чтобы хранить все это VertexAttribPointer
инструкции заранее и отправьте их все сразу, просто связав одну во время рендеринга в основном цикле, и шейдеры, чтобы дать вам больше контроля в процессе рисования вашей сцены на экране.
Сначала все это может звучать ошеломляюще, но с практикой вы привыкнете к этому.
Других решений пока нет …