glGenBuffers возвращает неуникальные имена - PullRequest
1 голос
/ 29 апреля 2011

Я думал, что это невозможно, но я вижу это с моим программным обеспечением. Я создал объект-оболочку для управления объектами буфера (я работаю с общими контекстами, поэтому я не могу использовать VAO), и сторона VBO работала нормально, пока я не начал тестировать его с IBO (glDrawElements (), я используя чистую среду OpenGL 3+).

Вот код для добавления буфера к моему объекту (Sy_GLObject):

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 );
}

Почему-то имена массивов индексов и массивов вершин одинаковы! setVertexPointer () на самом деле не вызывает glVertexAttribPointer (), он просто сохраняет параметры для него в классе POD - , поэтому между двумя командами addBuffers () не производится никаких вызовов OpenGL. Вызов вершины является «правильным», так как он на один выше, чем предыдущий результат glGenBuffers (), но с точки зрения addBuffers () между вызовами не должно быть никакой разницы.

Существуют ли обстоятельства, когда glGenBuffers может вернуть имя уже используемого буфера!?

Спасибо!

Обновление
Чтобы убедиться, что многопоточность не является фактором, я обернул статический мьютекс вокруг блока glGenBuffers ().

QMutexLocker locker( &mutex_ ); // mutex_ is a QMutex static class member.
uint* adds = new uint[numBuffers];
glGenBuffers( numBuffers, adds );
locker.unlock();

Но это никак не повлияло ...

1 Ответ

6 голосов
/ 30 апреля 2011

Спасибо Илиану Диневу на форумах OpenGL.org за указание на эту глупую ошибку. Я создал свой объект Buffer в стеке, и его удобно вызывать деструктором glDeleteBuffers (). Фантастический кусочек дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...