在OpenGL里面使用多线程加载纹理是很美好的构想。
网上讨论这个的并不多。中文博客里http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html
参考了某个老外的尝试:
http://veelck.wordpress.com/2008/11/28/multithread-texture-loading-in-opengl/
其基本思路如下:
要创建新的rendering context (RC), 先需要device context(DC).
DC可以在得到HWND后得到:
HDC hDC = GetDC(hWnd);
接下来使用Windows extension函数:wglCreateContext创建RC。如果失败返回NULL。
在这里我们用1个hDC创建2个RC:
HGLRC rendContext1 = wglCreateContext(hDC);
HGLRC rendContext2 = wglCreateContext(hDC);
接下来我们用1个RC加载图片,一个用来渲染。困难的是你必须共享2个RC之间的资源。
因为你在一个RC中创建的纹理在另外一个RC中是不可访问的,反之亦然。
使用这个方法共享RC:
wglShareLists(rendContext2, rendContext1);
最好在调用context任何操作前完成这个操作!最好在与OpenGL做任何交互前调用。
现在可以在不同线程里使用RC了。不需要每次都使用,只需要在线程开始前调用即可。
renderingThread()
{
//...
wglMakeCurrent(hDC, rendContext1);
//...
wglDeleteContext(rendContext1);
}
loadingThread()
{
//...
wglMakeCurrent(hDC, rendContext2);
//...
wglDeleteContext(rendContext2);
}
再次注意,wglShareLists 只能在进程内工作。所以使用多线程而不是多进程。
wglMakeCurrent只是设置本线程的默认RC。所以并不关心其他线程在干什么。
现在你可以在Load线程里放心的调用图片加载,如glGenTextures、glTexParameteri、glTexImage2D了。
而Render线程也可以访问Load线程的资源。
如果你想在Render线程里也加载图片,记住某些图片库( DevIL)不支持多线程加载。自己去做线程互斥把。
我没有尝试多线程渲染。但从网上资料来看,即使有也没有意义。 OpenGLz的contexts切换会带来大量额外负担。
在进程的最后要释放并删除contexts。
wglMakeCurrent(NULL, NULL).
====================================================
以上是作者的基本思路。
在我的项目里,我尝试用一个线程专门用于动态加载纹理。
看上去运行的不错。不幸的是,当纹理加载频率教高的时候,纹理会出现白框和闪烁。
在ATI的某些显卡上效果会好很多,基本看不到奇怪现象;在NV的显卡上相当明显。
这个问题尚没有完美解决。基本只能在多线程里将纹理读到内存,然后在主渲染线程里读入显存。
分享到:
相关推荐
本人原创,浅显易懂,QT+OPENGL多线程,采用2D纹理贴图的方式,多线程进行纹理拷贝和渲染。
用多线程实现OpenGL渲染, 子线程负责渲染, 主线程负责干其他事情.
发了一天功夫才把多线程的问题搞定,上传以后使用。若其他读者看到,希望能看懂我的苦心。thread相关的CPP需要你自己加上去,它们在压缩文件里面。
采用VBO技术的真正的多线程多窗口OpenGL程序 vs2008编译通过。
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码.
win32窗口实现的多显示器多窗口多线程OpenGL程序源代码. 可以全屏及窗口显示.
在visual stdio 2010 中开发的... 这个程序是个多线程的程序。我开了一个线程用来交互,用户可以在命令行中输入指令与程序进行交互。具体指令都列在了readme文件中。在read asf 文件的功能上程序有bug,欢迎大家更改。
柠檬多线程渲染引擎框架该框架旨在提供一个接口,通过该接口可以编写实时响应式图形应用程序。 Lemon应该允许对图形硬件功能的统一访问,消除诸如OpenGL的线程限制和Vulkan的低级管理要求之类的进入障碍。 该框架...
Qt 多线程实现波形图标,一个简单的例子,初学者很容易懂,主要是多线程处理数据,发回ui 线程去显示,防止单线程时,数据量大卡死
swGL:C ++中OpenGL 1.3的多线程软件实现
利用OpenGL实现多视图,方便多种数据的显示
MFCwithOpenGLWindow51-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码,增加了glut定时控制显示刷新,可以在MFC中控制GL的绘图。
QT OpenGL多线程播放YUV420序列,内附测试序列可直接运行。 被实例是对QT自带实例中的threadedqopenglwidget工程的修改,模拟从网络接收到的YUV序列进行修改和优化,避免主线程等待而导致进程无响应。
运行时点击渲染,弹出对话框后在四个text控件中分别显示四幅OpenGL渲染得到的图像。用到了多线程
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码
Android_3D_OpenGL ES 基础教程(中文版),从3D相关的基本概念讲起,也是很好的入门资料,需要的同仁拿去
侯俊杰的《深入浅出MFC》第十四章多线程程序。 按照书上的要求添加了菜单和命令处理,并在线程函数ThreadFunc中加上了计算与绘图功能,实现了与第一章相似的功能。 不足之处是由于不知道该如何获取View窗口的句柄,...
OpenGL+MFC的实现多层次显示,
OpenGL论文 OpenGL论文 OpenGL论文 OpenGL论文 OpenGL论文
OpenGL教程 OpenGL教程 OpenGL教程 OpenGL教程 OpenGL教程