首页 文章

glBufferData和glBufferDataARB

提问于
浏览
1

我找到了以下代码:

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 回答

  • 5

    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 混合了相同功能的标准和扩展形式 .

    对于问题的第二部分:

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    取消绑定先前绑定的缓冲区 . 想象它绑定一个“null”缓冲区,类似于在C / C中使用空指针指示指针不指向对象的方式 .

相关问题