Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程中目标的opengl绑定失败_Opengl - Fatal编程技术网

线程中目标的opengl绑定失败

线程中目标的opengl绑定失败,opengl,Opengl,我试图通过线程更新顶点缓冲区的内容。 在线程函数内部,无法绑定缓冲区 指向目标,或通过glMapBufferRange检索指针。 我总是得到错误1282。线程外的所有功能 很好 while( t_con->out_loop ) { Sleep( t_con->sleep_time ); if( t_con->in_loop ) { t_con->count++;

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

任何建议?

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

只需在线程中调用
SetCurrent()
命令或类似命令。 记住,主线程(应用程序启动的地方)也是一个线程。因此,如果它使用任何gl命令,它还需要
SetCurrent()

此外,必须注意的是,gl上下文在任何时候都最多可以是线程上的当前上下文。实际上,在任何工作线程使其成为当前上下文之前,必须先释放主线程上的上下文。因此,在大多数情况下,在多个线程中使用单个OpenGL上下文既不方便也不高效

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

有更好的选择,尤其是:

  • 只需将所有GL调用保持在单个线程中,并在GL线程中执行
    glMapBufferRange
    。在映射缓冲区时,整个进程都可以写入缓冲区,因此任何其他线程都可以填充缓冲区

  • 使用多个GL上下文。每个线程都可以有自己的上下文,并始终保持最新。通过使用共享上下文,实际数据对象(如纹理、缓冲区)在上下文之间共享,因此您可以访问其他线程中GL上下文将使用的数据


  • 在任何情况下,您都需要在这些线程之间进行适当的同步,这可能会有所帮助。

    谢谢您,我的朋友