我现在正在维护一个滞后代码,并在OpenGL中发现“奇怪”的用法。

首先,OpenGL版本为3.2 兼容性配置文件

然后,代码中没有引用VAO,但是,在Dont need to have a VAO?中,@ Dietrich Epp所说的如下:



让我感到困惑的是如何将数据馈送到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

问题写为评论。谁能解释这种用法的工作原理?

最佳答案



不会。索引数组未与任何属性“关联”。对索引进行渲染时,使用的索引将应用于所有属性。你cannot use different indices to fetch different attributes



当然可以。绑定(bind)到GL_ARRAY_BUFFER的内容对于呈现目的并不重要。仅当调用glVertexAttrib*Pointer时才重要,GL_ARRAY_BUFFER接受当前绑定(bind)到该绑定(bind)点的缓冲区,并将给定的属性索引挂接到该缓冲区。

认为glVertexAttrib*Pointer只是将其他参数传递给ojit_code的怪异方法。由于您没有调用该函数,因此多余的参数不会传递给任何人。

在兼容性上下文中“不使用VAO”时,您仍在使用VAO。 VAO-modifying functions的工作原理与核心上下文完全相同。唯一的区别是,在兼容性上,VAO对象0是真实的顶点数组对象,而在核心上下文中,它不是有效的对象。因此,在兼容性情况下,当前总是绑定(bind)了一些VAO。

关于c++ - 为什么VBO中与EBO不相关的数据也被馈送到OpenGL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50284315/

10-11 21:58