我找到了以下代码:
glGenBuffers(1, &m_posVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_posVBO);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glVertexAttribPointer(particle_attributes::POSITION, 4, GL_FLOAT, GL_FALSE,0,0);
glEnableVertexAttribArray(particle_attributes::POSITION);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &m_colorVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_colorVBO);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glVertexAttribPointer(particle_attributes::COLOR, 4, GL_FLOAT, GL_FALSE,0,0);
glEnableVertexAttribArray(particle_attributes::COLOR);
glBindBufferARB(GL_ARRAY_BUFFER, m_posVBO);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, size, m_vPos, GL_DYNAMIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER, m_colorVBO);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, size, m_vCol, GL_DYNAMIC_DRAW_ARB);
glBindBuffer(GL_ARRAY_BUFFER, 0);
我想知道为什么 glBufferData()
和 glBufferDataARB()
分别用一个唯一的VBO调用,而零值在_1658036中代表什么?
1 回答
glBufferDataARB()
和glBufferData()
服务于同一目的 . 第一种形式的ARB
表示入口点是OpenGL ARB(架构审查委员会)批准的扩展的一部分 . 第二种形式是标准OpenGL规范的一部分 .常见的过程是首先提供新的OpenGL功能作为扩展 . 然后他们可以经历各个阶段:
有时它们作为特定于供应商的扩展而开始,这表示它们具有像
NV
这样的供应商代码作为其名称的一部分 .如果多个供应商同意扩展,则在其名称中以
EXT
表示 .如果架构审核委员会批准扩展,则
EXT
将替换为ARB
.如果该功能成为标准OpenGL的一部分,它将被添加到OpenGL规范中,并且入口点不再具有特殊字母代码 .
在您的示例中,
glBufferDataARB()
是ARB_vertex_buffer_object extension的一部分 . 然后,此功能成为1.5版标准OpenGL的一部分 . 这是很久很久以前(2003年7月29日) .这意味着对于任何1.5及更高版本,您可以而且应该使用
glBufferData()
. 在这种情况下,绝对没有理由使用glBufferDataARB()
.为相同功能混合标准和扩展入口点可能存在问题 . 在某些情况下,功能被采用作为标准,完全按照相应扩展中的定义,两者是等效的 . 但在其他情况下,它们可能会在此过程中稍作调整,或者甚至在功能添加到标准时对合并的类似功能进行了多次扩展 . 在这些情况下,混合标准和扩展入口点可能不起作用 .
总结:如果您的OpenGL实现具有对该功能的标准支持,请不要使用扩展(
ARB
)表单 . 并且 never 混合了相同功能的标准和扩展形式 .对于问题的第二部分:
取消绑定先前绑定的缓冲区 . 想象它绑定一个“null”缓冲区,类似于在C / C中使用空指针指示指针不指向对象的方式 .