C++ 返回非唯一名称的glGenBuffers

C++ 返回非唯一名称的glGenBuffers,c++,opengl,buffer,C++,Opengl,Buffer,我认为这是不可能的,但我在我的软件中看到了这一点。我已经构建了一个包装器对象来管理我的缓冲区对象(我正在使用共享上下文,所以我不能使用VAOs),VBO方面的工作一直很好,直到我开始用IBOs(glDrainElements(),我使用的是纯OpenGL 3+环境)测试它 以下是向我的对象(Sy_GLObject)添加缓冲区的代码: 由于某些原因,索引数组和顶点数组的名称都是相同的!SetVertexInter()实际上并不调用glVertexAttribPointer(),它只是将其参数存储在

我认为这是不可能的,但我在我的软件中看到了这一点。我已经构建了一个包装器对象来管理我的缓冲区对象(我正在使用共享上下文,所以我不能使用VAOs),VBO方面的工作一直很好,直到我开始用IBOs(glDrainElements(),我使用的是纯OpenGL 3+环境)测试它

以下是向我的对象(Sy_GLObject)添加缓冲区的代码:

由于某些原因,索引数组和顶点数组的名称都是相同的!SetVertexInter()实际上并不调用glVertexAttribPointer(),它只是将其参数存储在一个POD类中-因此在两个addBuffers()命令之间不进行OpenGL调用。vertex调用是“正确的”,因为它比前面的glGenBuffers()结果高一个,但是从addBuffers()的角度来看,调用之间应该没有区别

是否存在glGenBuffers可能返回已在使用的缓冲区名称的情况

谢谢

更新
为了确保线程不是一个因素,我在glGenBuffers()块周围包装了一个静态互斥体


但是它完全没有效果…

多亏了OpenGL.org论坛上的Ilian Dinev指出了这个愚蠢的错误。我在堆栈上创建了缓冲区对象,并方便地让它的析构函数调用glDeleteBuffers()。非常棒的设计。

您是否碰巧处于线程化环境中?很可能,这都是在基于Qt的GUI中运行的,该GUI对各个部分进行线程化。这当然有道理,我会做更多的测试。根据更新,我对glGenBuffers()块进行了静音,但没有效果。我想知道其他OpenGL函数是否可以绕过我的线程保护隐式调用glGenBuffers?似乎只有glBindBuffers()可以隐式调用glGenBuffers(),但是在我的代码中,只有我的GL wrapper对象直接调用此函数,它只使用glGenBuffers()提供的地址。这让我快发疯了。。。
QList< uint > Sy_GLObject::addBuffers( uint numBuffers, GLenum target,
                                       GLenum numericType, GLenum usage )
{
    uint* adds = new uint[numBuffers];
    glGenBuffers( numBuffers, adds );

    QList< uint > l;
    for ( uint i = 0; i < numBuffers; ++i ) {
            Buffer buffer( target, adds[i], 0, numericType, usage );
            buffers_ << buffer;

            l << i;
    }
    delete[] adds;

    Sy_GL::checkError();
    return l;
}
void Sy_BVH::initialiseGLObject()
{
    Sy_application::getMainWindow()->getActiveProject(
                                        )->getModelContext()->makeCurrent();

    GLuint vLoc = Sy_settings::get( "shader/flat/vertexLoc" ).toUInt();
    drawBBs_ = Sy_GLObject::createObject();

    //  Add vertex array.
    drawBBs_->addBuffers( 1 );
    drawBBs_->buffers()[0].setVertexPointer( vLoc );

    //  Add indices array.
    drawBBs_->addBuffers( 1, GL_ELEMENT_ARRAY_BUFFER, GL_UNSIGNED_INT );
}
QMutexLocker locker( &mutex_ ); // mutex_ is a QMutex static class member.
uint* adds = new uint[numBuffers];
glGenBuffers( numBuffers, adds );
locker.unlock();