OpenGL большие проекты, VAO-ы и многое другое
Так что я изучал OpenGL 3.3 на https://open.gl/ и я действительно запутался в некоторых вещах.
- ВАО-х годов. Насколько я понимаю, они используются для хранения
glVertexAttribPointer
звонки. - ВБО-s. Они хранят вертеки. Так что, если я делаю что-то с несколькими объектами, мне нужно VBO для каждого объекта?
- Шейдерные программы - зачем нам несколько и что именно они делают?
- Что именно делает эта строка: glBindFragDataLocation(shaderProgram, 0, "outColor");
Самое главное, как все это вписывается в большую программу? Для чего именно используются ВАО-ы? В большинстве уроков рассказывается только о том, как нарисовать куб или 2 с жестко закодированными вершинами, так как же перейти к управлению сценами с большим количеством объектов? Я прочитал эту ветку и получил немного понимания о том, как происходит управление сценами, и все же, но все же я не могу понять, как связать материал OpenGL со всем этим.
1 ответ
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
инструкции заранее и отправьте их все сразу, просто связав одну во время рендеринга в основном цикле, и шейдеры, чтобы дать вам больше контроля в процессе рисования вашей сцены на экране.
Сначала все это может звучать ошеломляюще, но с практикой вы привыкнете к этому.