线程中目标的opengl绑定失败

时间:2018-07-10 15:26:08

标签: opengl

我正在尝试通过线程更新顶点缓冲区的内容。 在线程函数内部,无法绑定缓冲区 到目标,或通过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 );
    }
  }

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

除了@Ripi2's answe外,还必须注意,GL上下文最多可以随时存在于线程中。实际上,必须先在主线程上释放上下文,然后任何工作线程才能将其设为最新。因此,在大多数情况下,在多个线程中使用单个OpenGL上下文既不方便也不高效。

  

我正在尝试通过线程更新顶点缓冲区的内容。在线程函数内部,无法将缓冲区绑定到目标,也无法通过glMapBufferRange检索指针。

为此,有很多个更好的选择,

  1. 只需将所有GL调用保留在一个线程中,然后在GL线程中执行glMapBufferRange。缓冲区被映射时,整个过程都是可写的,因此任何其他线程都可以填充它。

  2. 使用多个GL上下文。每个线程可以拥有自己的上下文,并始终保持最新状态。通过使用 shared 上下文,实际的数据对象(例如纹理,缓冲区)将在上下文之间共享,因此您可以在另一个线程将使用的GL上下文中访问数据。

在任何情况下,您都需要在这些线程之间采用某种适当的同步方法,而OpenGL Sync Objects可能会有所帮助。

答案 1 :(得分:0)

在执行任何gl命令之前,必须将gl上下文设置为当前使用这些gl命令的线程

只需在线程中调用SetCurrent()命令或类似命令即可。

请记住,主线程(应用启动的地方)也是一个线程。因此,如果使用任何gl命令,它也需要SetCurrent()