做一个OpenGL控件
2007-11-27 14:53
260 查看
导读:
OpenGL是一个独立于窗口的图形库,而图形最终是在窗口系统里绘制出来的,那么OpenGL的绘图命令是怎么在窗口里生成输出的呢?
这就是各个系统上的OpenGL实现者需要做的工作了。在Windows里是通过wgl库完成的,在X-Windows里是通过glx服务器来完成的,至于这些OpenGL实现具体是怎么工作的,请参考sgi发布的sample implement源码,不过那个代码是用C写的。
在MS-Windows里,wgl库负责将OpenGL的绘制设备RenderContext与GDI的DeviceContext联系起来,使得发到OpenGL的RC里的命令生成的位图能够在GDI DC里绘制出来,你可以把它想象成OpenGL在RC里有一个FrameBuffer,记录着生成的图案,而wgl则负责把FrameBuffer的内容BitBlt到DC上。当然,这并不是它实际的工作方法,如果想了解更多请参考SGI发布的SDK资料或联系MS公司。
为了使GDI DC能够接受OpenGL RC的输出,必须为DC选定特别的像素格式,然后建立RC,再用wglMakeCurrent把当前要使用的RC和DC联系起来。此后我们就可以用OpenGL命令正常工作了。在一个程序里可以创建多个RC和多个DC,程序中的OpenGL命令会发到被wglMakeCurrent指定为当前的那一组合中。
我并不认为这个初始化过程是个很有意思的工作,这个世界上有很多聪明的程序员也这么想,所以他们发明了glaux库和glut库。glaux是在著名的OpenGL Programmer Guide里提出的,这本书是OpenGL编程的官方文档,因为它的封皮是红色的,所以通常简称为RedBook。故名思意,glaux是一套输助库,它使得你无须关心在具体窗口系统里初始化、消息响应的细节,而是使用传统的c/dos程序风格编制OpenGL程序。
int main(int argc, char** argv)
{ auxInitDisplayMode( AUX_SINGLE|AUX_RGB|AUX_DEPTH16);//使用单缓冲、RGB彩色模式、16位浓度
auxInitPosition(0,0,250,250);
auxInitWindow("Title");//以上两行在(0,0)片建立了一个大小为250X250的窗口,其标题为"Title"。
myinit();//建立OpenGL透视投影环境
auxReshapeFunc(myReshape);//指定窗口大小变化的响应函数
auxMainLoop(display);//指定绘制函数
return 0; }
由于glaux是为教学目的开发的,所以实用价值很限,所以又有程序员开发了glut,这套库被广泛使用,它的工作方式与glaux极为类似,但功能完善得多,特别是对交互、全屏等的支持要理想得多,所以许多的OpenGL演示程序使用它,比如SGI网站 峁┑亩嗍
OpenGL是一个独立于窗口的图形库,而图形最终是在窗口系统里绘制出来的,那么OpenGL的绘图命令是怎么在窗口里生成输出的呢?
这就是各个系统上的OpenGL实现者需要做的工作了。在Windows里是通过wgl库完成的,在X-Windows里是通过glx服务器来完成的,至于这些OpenGL实现具体是怎么工作的,请参考sgi发布的sample implement源码,不过那个代码是用C写的。
在MS-Windows里,wgl库负责将OpenGL的绘制设备RenderContext与GDI的DeviceContext联系起来,使得发到OpenGL的RC里的命令生成的位图能够在GDI DC里绘制出来,你可以把它想象成OpenGL在RC里有一个FrameBuffer,记录着生成的图案,而wgl则负责把FrameBuffer的内容BitBlt到DC上。当然,这并不是它实际的工作方法,如果想了解更多请参考SGI发布的SDK资料或联系MS公司。
为了使GDI DC能够接受OpenGL RC的输出,必须为DC选定特别的像素格式,然后建立RC,再用wglMakeCurrent把当前要使用的RC和DC联系起来。此后我们就可以用OpenGL命令正常工作了。在一个程序里可以创建多个RC和多个DC,程序中的OpenGL命令会发到被wglMakeCurrent指定为当前的那一组合中。
我并不认为这个初始化过程是个很有意思的工作,这个世界上有很多聪明的程序员也这么想,所以他们发明了glaux库和glut库。glaux是在著名的OpenGL Programmer Guide里提出的,这本书是OpenGL编程的官方文档,因为它的封皮是红色的,所以通常简称为RedBook。故名思意,glaux是一套输助库,它使得你无须关心在具体窗口系统里初始化、消息响应的细节,而是使用传统的c/dos程序风格编制OpenGL程序。
int main(int argc, char** argv)
{ auxInitDisplayMode( AUX_SINGLE|AUX_RGB|AUX_DEPTH16);//使用单缓冲、RGB彩色模式、16位浓度
auxInitPosition(0,0,250,250);
auxInitWindow("Title");//以上两行在(0,0)片建立了一个大小为250X250的窗口,其标题为"Title"。
myinit();//建立OpenGL透视投影环境
auxReshapeFunc(myReshape);//指定窗口大小变化的响应函数
auxMainLoop(display);//指定绘制函数
return 0; }
由于glaux是为教学目的开发的,所以实用价值很限,所以又有程序员开发了glut,这套库被广泛使用,它的工作方式与glaux极为类似,但功能完善得多,特别是对交互、全屏等的支持要理想得多,所以许多的OpenGL演示程序使用它,比如SGI网站 峁┑亩嗍
相关文章推荐
- 如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?
- 如何在VC6或者VC7下用 ATL做一个OpenGL的(COM)控件?
- OpenGL里用gluTessBeginPolygon画带孔和凹多边形需要非常注意的一个问题!
- HTML中FILE控件的一个注意事项
- 点击一个checkbox控件,使得Datagrid里的模版里放的checkbox全部选中
- 点滴积累【ASP.NET】---定义一个textbox用户控件在ascx页面!在不同的aspx页面调用时动态验证
- jquery 两个控件同享一个function
- 在窗体上放置一个菜单、一个工具栏控件,工具栏上有两个按钮,分别对应“打开文本文件”、“保存文本文件”
- 一个相当独立的.通用分页控件 c# 源码一
- iOS-----openGL--openGL ES iOS 入门篇2--->绘制一个多边形
- 自定义控件之-一个简单的用户登录控件
- MinGW Developer Studio 中编译dev cpp程序(一个opengl例子)
- 从“绘制一个立方体”来看OpenGL的进化过程
- Html精确定位,ScrollHeight等介绍,以及一个例子实现在某个控件处打开一个DIV
- 我收集的一些资源: 控件抖动效果、中间一个亮点的闪屏,图片缓存
- 一个极好的OpenGL汉字显示类(转,作者Y_Y)
- 一个非常好用的自定义圆形控件
- AjaxToolkit中ModalPopupExtender控件的一个不在PostBack后关闭的技巧
- 一个大牛的系列文章:An intro to modern OpenGL. Chapter 3: 3D transformation and projection
- C#:一个具有拖入和删除功能的图片框控件