【问题标题】:glGenBuffers 2 names?glGenBuffers 2 名称?
【发布时间】:2013-12-23 09:24:28
【问题描述】:

我一直在实现一个基于本教程的小型 opengl 应用程序: http://openglbook.com/the-book/chapter-4-entering-the-third-dimension/

我了解大部分代码,但我对这一行感到非常困惑:

glGenBuffers(2, &BufferIds[1]); 

然后是

glBindBuffer(GL_ARRAY_BUFFER, BufferIds[1]);
glBufferData(GL_ARRAY_BUFFER, size,  &theModel->theMesh.pos[0], GL_STATIC_DRAW);

我假设我只需要一个空闲名称/ID 来绑定我的缓冲区数据,但如果我改变了

 glGenBuffers(2,

 glGenBuffers(1,

缓冲区绑定失败,没有任何效果。

BufferIds 的大小为 3 (GLuint BufferIds[3])。我想使用 VAO 的第一个插槽和 VBO 的第二个插槽使其成为 BufferIds[2]。

glGenVertexArrays(1, &BufferIds[0]); 
ExitOnGLError("ERROR: Could not generate the VAO"); 
glBindVertexArray(BufferIds[0]); 
ExitOnGLError("ERROR: Could not bind the VAO"); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

ExitOnGLError("ERROR: Could not enable vertex attributes"); 

glGenBuffers(2, &BufferIds[1]);  //if this gets from changed 2 to 1 ...
ExitOnGLError("ERROR: Could not generate the buffer objects"); 

int size = theModel->theMesh.pos.size() * sizeof(theModel->theMesh.pos[0]) ; 

glBindBuffer(GL_ARRAY_BUFFER, BufferIds[1]); 
ExitOnGLError("ERROR: Could not bind the VBO to the VAO");  // ...this error triggers
glBufferData(GL_ARRAY_BUFFER, size, &theModel->theMesh.pos[0], GL_STATIC_DRAW);

【问题讨论】:

  • 旁注:我建议使用不同的变量名称。使用 BufferIds 存储缓冲区和顶点数组的 ID 不会通过我的代码审查。
  • 我同意 BufferIds 的名称,它不是我在教程中的名称,一旦我开始工作并了解发生了什么,我将重新编写它。我只需要知道如何编写干净的代码。
  • 说真的,这比你所说的数组更深刻。在 OpenGL 3 中,名称与它们的功能相关联。在此之前,如果需要,您可以使用glGenTextures (...) 生成的名称(或随机选择的唯一无符号整数值)来识别 VBO。您不想创建一个名称服务完全不同的函数的数组,因为如果您忘记了哪个索引属于哪种类型的对象,那么您在 GL3 中剩下的就是一个无意义的无符号整数数组;你甚至无法使用glIs___ 来确定是什么。
  • 因为 VAO 的集合可能有一个名称 23,而所有分配的 VBO 的集合也可能有一个名称 23glIsVertexArray (...) 将为名称 23 返回 true,glIsVertexBuffer (...) 也是如此。每组对象类型都有自己的可能重叠的名称池。

标签: c++ opengl buffer


【解决方案1】:

那是因为您将 BufferIds[1] 传递给 glBindBuffer。索引 1 实际上是第二个元素,所以当你只创建一个缓冲区时你的代码会崩溃。

试试看:

glGenBuffers(1, &BufferIds[0]);
glBindBuffer(GL_ARRAY_BUFFER, BufferIds[0]);

【讨论】:

  • 对不起,我修改了我的问题。第一个插槽已用于美国之音,然后我使用插槽 1,这是有道理的。我只是不明白为什么我必须让它生成两个名称。
  • 好吧,我的错。我没有意识到您还使用第二个元素调用 glGenBuffers。
  • 另一个想法:BufferIds[2] 会发生什么?你以后用吗?也许对 glGenBuffer 的调用应该初始化两个字段 [1] 和 [2]。
  • 我没有看到它在任何地方被使用,并且发生的错误,以及立即发生的错误我调用 glGenBuffers(2, &BufferIds[0]);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2012-08-04
相关资源
最近更新 更多