Область видимости glVertexAttributePointer?

В настоящее время я программирую приложение OpenGL ES 2.0 на платформах iOS и Android.

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

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

Но это дает мне странные результаты.

Мой вопрос: мы должны делать звонки glVertexAttribPointer каждый раз мы связываем новое VBO?

2 ответа

Решение

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

Так что да, всякий раз, когда вы хотите, чтобы ваши данные вершин были получены из другого VBO, вам нужно связать это VBO и сделать соответствующие glVertexAttribPointer звонки, пока это VBO связано. Хотя это может показаться громоздким в вашем случае, на самом деле это хорошая вещь. Таким образом, вам не нужно беспокоиться о текущем связанном буфере при рендеринге чего-либо, а только о том, что настроено с помощью glVertexAttribPointer, И что еще более важно, давайте связать другой VBO перед рендерингом, таким образом, вы можете получить разные атрибуты вершин из разных VBO за один вызов рендеринга (как еще вы это сделаете?).

РЕДАКТИРОВАТЬ: Однако вы можете использовать Vertex Array Objects, чтобы упростить процесс настройки ваших данных вершин. Они инкапсулируют все необходимое состояние для рендеринга из множества массивов (и, таким образом, все вещи изменяются glVertexAttribPointer, gl(En/Dis)ableVertexAttribArray и буфер связан с GL_ELEMENT_ARRAY_BUFFERно, как сказано, не буфер, связанный с GL_ARRAY_BUFFER). Вы все еще должны правильно связать буфер перед вызовом glVertexAttribPointer конечно. Но при использовании VAO этот код нужен только в некоторой процедуре настройки, и все, что вам нужно сделать для рендеринга, это вызов glBindVertexArray, Хотя я не знаю, поддерживает ли их ваше конкретное устройство ES.

Какой-то классный ресурс, который я нашел на рисовании с VAO / VBO

http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html

Он показывает, как вы можете управлять несколькими объектами, например, несколькими VAO и одним VBO (каждый VAO содержит указатели с разными смещениями для одного VBO)

Определенно стоит посмотреть, не говоря уже о той части, где вы узнаете, что

  • glBindBuffer(GL_ARRAY_BUFFER...не привязывает никаких данных, это просто глобальный указатель для следующего glVertexAttribPointer вызовы, которые делают фактическую привязку данных

НО

  • glBindBuffer(GL_ELEMENT_ARRAY_BUFFER...Связывает / сохраняет массив элементов в текущем VAO
Другие вопросы по тегам