我找到了以下代码:
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);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么两个glBufferData()和glBufferDataARB()分别用一个独特的VBO调用,零值代表glBindBuffer(GL_ARRAY_BUFFER, 0)什么?
glBufferDataARB()并glBufferData()服务于同一目的.第ARB一种形式表示入口点是OpenGL ARB(架构审查委员会)批准的扩展的一部分.第二种形式是标准OpenGL规范的一部分.
常见的过程是首先提供新的OpenGL功能作为扩展.然后他们可以经历各个阶段:
NV作为其名称的一部分.EXT其名称中的a表示.EXT则替换为ARB.在您的示例中,glBufferDataARB()是ARB_vertex_buffer_object扩展的一部分.然后,此功能成为1.5版标准OpenGL的一部分.这是很久很久以前(2003年7月29日).
这意味着对于任何版本1.5及更高版本,您可以并且应该使用glBufferData().glBufferDataARB()在这种情况下绝对没有理由使用.
为相同功能混合标准和扩展入口点可能存在问题.在某些情况下,功能被采用作为标准,完全按照相应扩展中的定义,两者是等效的.但在其他情况下,它们可能会在此过程中稍作调整,或者甚至在功能添加到标准时对合并的类似功能进行了多次扩展.在这些情况下,混合标准和扩展入口点可能不起作用.
总结:ARB如果您的OpenGL实现具有对该功能的标准支持,请不要使用extension()形式.而从未混合标准和扩展形式相同的功能.
对于问题的第二部分:
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
取消绑定先前绑定的缓冲区.想象它绑定一个"null"缓冲区,类似于在C/C++中使用空指针指示指针不指向对象的方式.
| 归档时间: |
|
| 查看次数: |
2056 次 |
| 最近记录: |