关于opengl多线程渲染问题

OpenGL Context同时只能被一个线程拥有,而在创建OpenGL窗口时被主线程占据了。

 

解决方法是用函数wglMakeCurrent( HDC hdc,HGLRC  hglrc),该函数可以将OpenGL Context关联到调用此函数的线程:在主线程里加上一句wglMakeCurrent(NULL,NULL),解除关联,在子线程开始时用wglMakeCurrent(hdc,hglrc)使子线程取得Context就行了。


我是在一篇关于多线程的OpenGL的英文资料里看到的,原文主要是解决同时用两个线程操作OpenGL:一个渲染,一个创建显示列表。

 

他用的方法是在渲染时渲染线程取得Context,结束后释放,另一个线程再占用……这样循环。

 

我估计甚至可以用wglMakeCurrent进行切换,实现多个线程同时往一个窗口上作图!当然不是完全同时,只是轮流占用而已。不过这样效率并不高

 

微软的文档讲wglMakeCurrent时并没有说清楚一些问题:

A thread用 wglCreateContext建立context;

B thread用wglMakeCurrent绑定context;

 

但是缺少了两点说明,否则你看不到图像更新(返回值都正常),或者wglMakeCurrent返回奇怪的错误:

1.创建context的A线程不能退出了,否则即使B线程绑定了,也得不到图像更新;

2.有些显卡(我试过Intel的显卡)需要A线程线程解绑定wglMakeCurrent(0, 0),否则这个函数返回BUZY的错误;

还有,A线程创建的context事实上可以被多个线程轮番使用,但前提是每次使用之前需要wlgMakeCurrent绑定,使用之后应该wglMakeCurrent(0, 0)解出绑定。

 

opengl的API做的不好的就是:错误检测机制做的不好,没图像了,但是很难从那个函数查出它的原因在哪里?

 

你可能感兴趣的:(OPenGL,关于opengl多线程渲染问题,opengl多线程渲染问题,opengl多线程,opengl多线程渲染,opengl渲染)