LearnOpenGL VAO VBO EBO

2020-09-14  本文已影响0人  li_礼光
  VAO VBO EBO 的关系
     ------------------------
     | VBO                  |
     | -------------------- |
     | | VAO              | |
     | -------------------- |
     | -------------------- |
     | | VAO              | |
     | -------------------- |
     | -------------------- |
     | | VAO              | |
     | -------------------- |
     | -------------------- |
     | | VAO              | |
     | -------------------- |
     |  ....                |
     |  ....                |
     |                      |
     ------------------------

     | -------------------- |
     | | EBO              | |
     | -------------------- |

可以理解为EBO是最后一个VBO, EBO是专门用来处理索引的

有的教程说EBO是最后一个特殊的VAO, 也可以这么理解吧, EBO是放在整个内存的最后面. 但从代码的绑定方法来看, EBO的创建方式和VBO的又是样的. 也可以理解为紧挨着VBO的特殊的VBO吧.
(后面再深刻整理下EBO)

image.png
  //创建VBO
  glGenBuffers(1, &VBO);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);
        
  //创建VAO
  glGenVertexArrays(1, &VAO);
  glBindVertexArray(VAO);
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
  glEnableVertexAttribArray(0);
        
  //创建EBO, 这里的EBO相当于索引的作用
  glGenBuffers(1, &EBO);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(squareIndices), squareIndices, GL_STATIC_DRAW);

  //解绑VAO
  glBindVertexArray(0);

从代码分析来看, 这里面
VAO : glBindVertexArray
VBO : glBindBuffer
EBO : glBindBuffer

#define GL_ARRAY_BUFFER 0x8892
#define GL_ELEMENT_ARRAY_BUFFER 0x8893

首先VAO调用的绑定方法和VBO, VEO不一样.
绑定的buffer类型也不相同 GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER

思路整理下就很容易理解了.

上一篇下一篇

猜你喜欢

热点阅读