gpt4 book ai didi

c++ - glGenBuffers 返回非唯一名称

转载 作者:行者123 更新时间:2023-11-30 00:58:41 33 4
gpt4 key购买 nike

我认为这是不可能的,但我在我的软件中看到了它。我已经构建了一个包装器对象来管理我的缓冲区对象(我正在使用共享上下文,所以我不能使用 VAO),并且在我开始使用 IBO(glDrawElements(),我' m 使用纯 OpenGL 3+ 环境)。

这是为我的对象 (Sy_GLOb​​ject) 添加缓冲区的代码:

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() block 周围包装了一个静态互斥量。

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

但是完全没有效果...

最佳答案

感谢 OpenGL.org 论坛上的 Ilian Dinev 指出了这个愚蠢的错误。我在堆栈上创建了我的 Buffer 对象,并方便地调用了它的析构函数 glDeleteBuffers()。很棒的设计。

关于c++ - glGenBuffers 返回非唯一名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5836611/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com