почему данные в VBO, не связанные с EBO, также передаются в OpenGL? - PullRequest
0 голосов
/ 11 мая 2018

Я сейчас поддерживаю слабый код и обнаружил «странное» использование в OpenGL.

Во-первых, версия OpenGL имеет 3.2 профиль совместимости .

Затем,в коде нет ничего отсылающего к VAO, однако, в Вам не нужно иметь VAO? что @Dietrich Epp говорит ниже:

Если вы используете контекст совместимости OpenGLВам не нужен ВАО.В некотором смысле, существует VAO «по умолчанию», которая всегда связана.

И что меня смутило, это способ подачи данных в OpenGL .Псевдокод может объяснить ясно:

// foo.cpp

void PrimitiveLoading()
{
  // load vertex position data
  glBindBuffer(GL_ARRAY_BUFFER, postionVBO);
  glBufferData(GL_ARRAY_BUFFER, /* postion data */);
  glBindBuffer(GL_ARRAY_BUFFER, 0);

  // load vertex position index data 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, positionEBO);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, /* postion index data */);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

  // load UV data 
  glBindBuffer(GL_ARRAY_BUFFER, uvVBO, GL_STATIC_DRAW);
  glBufferData(GL_ARRAY_BUFFER, /* UV data */);
  glBindBuffer(GL_ARRAY_BUFFER, 0);

  /*
  The postion data are loaded before ELEMENT, while the UV data are behind. 
  This means ELEMENT is associated with the postion but not the UV, right?
  */
}

void PrimitiveRendering()
{
  // define the vertex postion format
  glBindBuffer(GL_ARRAY_BUFFER, postionVBO);
  glVertexAttribPointer(/*position attribute setting*/);

  // define the uv format
  glBindBuffer(GL_ARRAY_BUFFER, uvVBO);
  glVertexAttribPointer(/*UV attribute setting*/);
  glBindBuffer(GL_ARRAY_BUFFER, 0); // GL_ARRAY_BUFFER bind to 0

  // draw
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, positionEBO);
  glDrawElements(GL_TRIANGLES, positionEBO, GL_UNSIGNED_INT, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

  /*
  before drawing, GL_ARRAY_BUFFER bind to 0(not bind to both postionVBO and uvVBO), but it works.

  And the data are fed to respectively postionVert and uvVert in foo.vert below as expected. how and why ? 

  Moreover, it seems the ELEMENT affects not not only postionVAO but also uvVAO.
  */
}

// foo.vert

version 150

in vec3 postionVert;
in vec2 uvVert;

...// other code

вопросы написаны в виде комментариев.Кто-нибудь может объяснить, как работает это использование?

1 Ответ

0 голосов
/ 11 мая 2018

Позиционные данные загружаются перед ELEMENT, в то время как данные UV остаются позади.Это означает, что ЭЛЕМЕНТ связан с положением, но не с УФ, верно?

Нет.Индексные массивы не «связаны» ни с одним атрибутом.Когда вы выполняете индексированный рендеринг, используемый индекс применяется к всем атрибутам.Вы не можете использовать разные индексы для извлечения разных атрибутов .

перед рисованием, GL_ARRAY_BUFFER привязывает к 0 (не привязывает как к postionVBO, так и к uvVBO), но это работает.

Конечно, это работает.То, что связано с GL_ARRAY_BUFFER , не имеет значения для целей рендеринга.Это только имеет значение, когда вы вызываете glVertexAttrib*Pointer, который берет буфер, который в данный момент привязан к этой точке привязки, и подключает данный индекс атрибута к этому буферу.

Думайте о GL_ARRAY_BUFFER какпросто странный способ передачи дополнительного параметра в glVertexAttrib*Pointer.Поскольку вы не вызывали эту функцию, дополнительный параметр никому не передается.

Когда вы «не используете VAO» в контексте совместимости, вы все еще используете VAO. VAO-модифицирующие функции работают точно так же, как и для основных контекстов.Единственное отличие состоит в том, что в совместимости объект 0 VAO является реальным объектом массива вершин, тогда как в основных контекстах он не является допустимым объектом.Таким образом, в контексте совместимости всегда есть некоторое VAO, которое в настоящее время связано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...