我正在尝试通过线程更新顶点缓冲区的内容。 在线程函数内部,无法绑定缓冲区 到目标,或通过glMapBufferRange检索指针。 我总是收到错误1282。外部线程函数可以执行所有操作 工作正常。
while( t_con->out_loop )
{
Sleep( t_con->sleep_time );
if( t_con->in_loop )
{
t_con->count++; // thread counter up
EnterCriticalSection( &__cr_sec );
/*******************************************/
/* create the strings for the variables */
/*******************************************/
str_run = sfs_p->str_ptr;
sprintf( str_run, "%4.0f / %4.0f", __mou.pos.x, __mou.pos.y ); // actual mouse position
str_run += sfs_p->str_size;
sprintf( str_run, "%4.0f / %4.0f", __mou.old_pos.x, __mou.old_pos.y ); // old mouse position
str_run += sfs_p->str_size;
sprintf( str_run, "%4.0f / %4.0f", __mou.travel.x, __mou.travel.y ); // mouse travel delta
str_run += sfs_p->str_size;
sprintf( str_run, "%d", __mou.but_l ); // mouse button left
str_run += sfs_p->str_size;
sprintf( str_run, "%d", __mou.but_m ); // mouse button center
str_run += sfs_p->str_size;
sprintf( str_run, "%d", __mou.but_r ); // mouse buttom right
str_run += sfs_p->str_size;
sprintf( str_run, "%f", __mou.speed ); // mouse speed
/******************************************************************/
/* create a Vertex_Buffer_Struct with the chars geometry data */
/******************************************************************/
vx = SFS_to_Vx_Buf( sfs_p );
glBindBuffer( GL_ARRAY_BUFFER, m_dbg->vao->vx_b->id );
G_E_C;
// bind the buffer
gl_ptr = glMapBufferRange( GL_ARRAY_BUFFER, 0, 300, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT ); // get the pointer
G_E_C;
Destroy_Vertex_Buffer_Struct( vx );
LeaveCriticalSection( &__cr_sec );
}
}
有什么建议吗?
答案 0 :(得分:1)
除了@Ripi2's answe外,还必须注意,GL上下文最多可以随时存在于线程中。实际上,必须先在主线程上释放上下文,然后任何工作线程才能将其设为最新。因此,在大多数情况下,在多个线程中使用单个OpenGL上下文既不方便也不高效。
我正在尝试通过线程更新顶点缓冲区的内容。在线程函数内部,无法将缓冲区绑定到目标,也无法通过
glMapBufferRange
检索指针。
为此,有很多个更好的选择,
只需将所有GL调用保留在一个线程中,然后在GL线程中执行glMapBufferRange
。缓冲区被映射时,整个过程都是可写的,因此任何其他线程都可以填充它。
使用多个GL上下文。每个线程可以拥有自己的上下文,并始终保持最新状态。通过使用 shared 上下文,实际的数据对象(例如纹理,缓冲区)将在上下文之间共享,因此您可以在另一个线程将使用的GL上下文中访问数据。
在任何情况下,您都需要在这些线程之间采用某种适当的同步方法,而OpenGL Sync Objects可能会有所帮助。
答案 1 :(得分:0)
在执行任何gl命令之前,必须将gl上下文设置为当前使用这些gl命令的线程。
只需在线程中调用SetCurrent()
命令或类似命令即可。
请记住,主线程(应用启动的地方)也是一个线程。因此,如果使用任何gl命令,它也需要SetCurrent()
。