多窗口使用OpenGL——wglShareLists使用简介
来源:互联网 发布:电商erp源码 编辑:程序博客网 时间:2024/04/29 14:34
在使用多窗口使用OpenGL的时候,发现只能运行一个,另外一个就暂停了...搜索有一下文章,且拿来参考:、
摘自:http://blog.csdn.net/webscaler/article/details/5873179
OpenGL 中用到多线程和多 render context 渲染的时候会用到 wglsharelist 进行资源共享,本文将对我本人在 wglsharelist 使用过程中的经验做个小总结:
首先翻译下 msdn 上对 wglsharelist 的说明:
wglShareLists
wglShareLists 函数使多个 OpenGL render contexts 可以共享一个显示列表空间。
- BOOL wglShareLists(
- HGLR C hglrc1 , // 提供共享资源的render context
- HGLRC hglrc2 // 共享别人资源的render context
- );
参数
hglrc1
指定共享显示列表的 OpenGL 渲染上下文。
hglrc2
指定共享 hglrc1 显示列表的 OpenGL 渲染上下文。当 wglShareLists 被调用时, hglrc2 不能包含任何显示列表。
返回值
当函数成功时,返回值为 TRUE.
当函数失败时,返回值为 FALSE 并且显示列表也不会被共享。调用 GetLastError 可以得到更多错误信息。
下面是我对 ShareList 的理解:
使用 OpenGL 在 windows 窗口上绘制图像需要一个 render context , 就像 GDI 需要 device context 一样,当然 render context 最终也是通过 device context 绘制到最终的显示设备上的,这里 render context 我们可以形象地看成一个管道,用来存储 OpenGL 用户的命令和数据,为了节省管道的容量和带宽,我们希望管道间共享数据,所以 windows 引入了 wglShareLists 。下面是我在使用过程中得出的几个注意事项:
<1> wglShareLists 的两个参数可以属于同一个 device context ,也可以属于不同 device context 。
<2> 不同 render context 切换时,切记要记得保存旧的 render context 和 device context ,以便恢复,这样其他地方的绘制才不会受到影响,示例代码如下:
- HDC l_oldDC = wglGetCurrentDC();
- HGLRC l_oldRC = wglGetCurrentContext();
- wglMakeCurrent(l_newDC, l_newRC);
- …………….
- SwapBuffers(l_newDC);
- wglMakeCurrent(l_oldDC, l_oldRC);
<3> 在 <2> 的示例代码中红色标出的 swapbuffer 操作,这个要和你设置 device context 的 pixel format 要一致,在 PIXELFORMATDESCRIPTOR 结构中有个 dwFlags 字段,如果设置了 PFD_DOUBLEBUFFER ,那一定要记得 swapbuffer 操作。
<4> wglShareLists 的两个参数谁分享谁的资源一定要搞清楚,之前在网上找的文章说错了,搞的我弄了半天都不对,后来换了一下就对了,这里我只讲正确的方式,免得大家搞混,请记住: hglrc2 分享 hglrc1 的资源。
好了,再讲下创建 render context 的步骤:
(a). 获取一个 DC
(b). 选择并且设置 DC 的像素格式
(c). 通过 API : wglCreateContext(DC) 创建一个 RC
(d). 设置当前的 RC ,通过 API : wglMakeCurrent(RC, DC) 来
这个在网上和 msdn 都可以查到,想进一步了解,就动起手来吧。本人 OpenGL 菜鸟,如有不对还请大家提出,不胜感激 :)
本文参考文章如下:
http://blog.csdn.net/blucexi/archive/2006/09/21/1262117.aspx
http://hi.baidu.com/atyuwen/blog/item/420d16ea7fdd36d5d539c9b6.html
- 多窗口使用OpenGL——wglShareLists使用简介
- wglShareLists使用简介
- OpenGL Shader Builder 使用简介
- OpenGL入门14——MFC窗口中使用glut函数
- QT中使用OpenGL(0)——创建一个窗口
- OpenGL 使用GLFW创建全屏窗口
- Qt下如何用OpenGL的共享列表wglShareLists函数
- BitButtonNL 自定义MFC窗口使用简介
- OpenGL基本概念入门2——使用OpenGL绘图
- 【OpenGL】OpenGL系列——01颜色使用
- SDL2 自建窗口使用OpenGL 时候 wglCreateContext 失败的解决方法
- OpenGL(一) 使用Win API 建立黑色窗口
- 计算机图形学——OpenGL基本使用
- OpenGL——使用着色器
- 基于Android的OpenGL—使用GLSurfaceView
- 使用OpenGL
- 使用OpenGL
- 从零开始使用C ++和OpenGL编写游戏引擎-01-简介
- windows环境下Nginx配置
- 提高员工执行力,提高项目执行力,提升企业执行力
- 传智播客 UI图标设计免费公开课 引领你进入UI设计的美妙世界!
- c# wince 获取程序当前路径
- eclipse调试
- 多窗口使用OpenGL——wglShareLists使用简介
- NLP常用工具
- JNI 参数传递分析
- 集合知识点总结03
- wince 隐藏、显示任务栏
- Android 控件学习--自定义SeekBar
- REF Cursor
- MessageBox的四个对话框
- 安卓中间件 hello dema解析