opengl wglsharelists
原文地址: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的更多相关文章
- 【转】OpenGL多线程创建纹理,附加我的测试结果
原文地址 http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html 关于这个问题以前只知道多个线程不能同时使用一个RC,结果为了能 ...
- OpenGL的API函数使用手册
(一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.aux.glut.wgl.glx.a ...
- opengl 函数
( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...
- 【OpenGL游戏开发之二】OpenGL常用API
OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...
- 创建OpenGL Context(WGL)
创建OpenGL Context(WGL) 创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL cont ...
- OpenGL 多线程共享纹理
1:opengl 多线程共享纹理纹理: //解码时候使用opengl进行绘制,需要构建队列和两个线程,分别用于解码数据并且填充纹理和渲染. 主线程常见两个共享上下文: main() { ⋯⋯⋯⋯ gH ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- [OpenGL超级宝典]专栏前言
我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...
- OpenGL超级宝典笔记----渲染管线
在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...
随机推荐
- STORM在线业务实践-集群空闲CPU飙高问题排查(转)
最近将公司的在线业务迁移到Storm集群上,上线后遇到低峰期CPU耗费严重的情况.在解决问题的过程中深入了解了storm的内部实现原理,并且解决了一个storm0.9-0.10版本一直存在的严重bug ...
- IP分片
物理网络层一般要限制每次发送数据帧的最大长度.任何时候IP层接受到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU(最大传输单元:Maximum Transm ...
- Cocos2d-x 3.0final 终结者系列教程03-源代码文件夹说明
话说今天从霍营到回龙观,走到天鑫家园东路.我肋哥去,堵死我啦.7:30出门,9:10还没到回龙观. 北京这交通真是坑爹.回过头想想.怪自己走小路,有时候确实快.可有时候真堵. 堵了35分钟后果断掉头, ...
- Azure Nosql
patterns & practices https://msdn.microsoft.com/en-us/library/ff921345.aspx Solution Development ...
- CentOS7添加logstash5启动脚本
默认情况使用rpm包安装完logstash之后没有启动脚本,这一点我觉得算是开发不够彻底.官网给了一个脚本,需要根据不同的系统版本生成对应的启动脚本,而且官网没有给明使用方法,对于新用户来说算是个坑, ...
- vue 阅读一【待完结】
初步方案:从第一个commit开始到到最近的commit,从代码的大纲开始到细节,利用思维导图. 注意: 源码阅读是一件比较枯燥的事情,要有别的东西一起做,源码只是偶尔看看,经常发呆的话,非常浪费时间 ...
- Zuul:构建高可用网关之多维度限流
对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次) 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次) 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟 ...
- PhantomJS与CasperJS在Windows下的安装与使用
按照网上的教程来呢,一定是不好使的,这是常理. 所以必须要告诉你怎么使用Phantomjs…… 这么用! 1.下载Phantomjs的压缩包并解压缩: 2.在bin目录(包含phantomjs.exe ...
- IPC介绍——10个ipcs例子
IPC介绍——10个ipcs例子 semaphorearrays2010performancesystemaccess ipcs是一个uinx/linux的命令.用于报告系统的消息队列.信号量.共享内 ...
- Android——数据存储:手机外部存储 SD卡存储
xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...