㊣ 大家一起来 ——》OpenGL 热身篇! (100分)

  • 主题发起人 主题发起人 YB_unique
  • 开始时间 开始时间
Y

YB_unique

Unregistered / Unconfirmed
GUEST, unregistred user!
1993年一家名为SGI的公司推出了OpenGL,谁能想到几年以后它已经成为了事实的三维图形开发工业标准。作为一个
图形应用程序设计界面(API)它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、
Sun、HP等大公司的认同。OpenGL已经成为一种标准,是从事三维图形开发工作的必要工具。也因此彻底改变了过去只能
依赖于价格昂贵的图形工作站及复杂的三维图形软件从事三维图形计算机应用的历史。目前,OpenGL由独立非赢利组织
ARB管理。它在WINDOWS中以动态链接库的形式存在,Win95以后的版本都自带有微软公司实现的OpenGL。瞧瞧系统目录下
不是有个“opengl32.dll”来着。
OpenGL是独立于操作系统的开放式的三维图形标准。实际上是一种图形与硬件的接口,它包括了几百个图形函数,
利用这些函数可以建立三维模型和三维实时交互。与其他图形软件程序设计接口不同的是OpenGL提供了非常清晰的图形
函数。利用这些图形函数,用户不但可以直接使用自己的数据,而且可以利用其他的数据源。OpenGL也是网络透明的,
它的运行机制是客户/服务器机制,由客户 (OpenGL的应用程序)向服务器(OpenGL的内核)发送OpenGL命令请求,服务
器则解释执行这些命令。一般客户和服务器运行于同一台计算机上。在 Windows平台上,OpenGL图形库被封装在
opengl32.dll中。通过调用opengl32.dll处理用户程序对OpenGL函数的调用,然后再调用winsrv.dll使OpenGL命令再
次得到处理并直接传给系统的其他设备驱动接口,最后把处理的图形指令传递给视频显示驱动程序。
OpenGL提供了两种颜色模式:RGBA模式和颜色索引模式。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时
也加上Alpha值即透明度。RGB三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。如:
(1,1,0)表示黄色,(0,0,1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示
(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中
RGBA 的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。OpenGL还提供了双缓存来绘制图像。即在显示
前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的
前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。
OpenGL的光源大体分为三种:环境光即来自于周围环境没有固定方向的光。漫射光来自同一个方向照射到物体表
面时在物体的各个方向上均匀发散。镜面光来自于同一方向也沿同一个方向反射。全局环境光是一种特殊的环境光,
它不来自于某种特定光源,通常做为场景的自然光源。
OpenGL中光源设定之Delphi示例如下:
glLightfv(GL_LIGHT1, GL_AMBIENT, @LightAmb); //设置环境光源
glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDif); //设置漫射光源
glLightfv(GL_LIGHT1, GL_POSITION,@LightPos); //设置光源位置
glEnable(GL_LIGHT1); // 使用Light1
glEnable(GL_LIGHTING); // 打开光照
GL_DIFFUSE 光源为漫射光光源
GL_AMBIENT 光源为环境光光源
GL_SPECULAR 光源为镜面光光源
怎么样?看起来是不是觉得很简单清晰呢?没想象中的那么无厘头吧!^_^
在OpenGL中,通过材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。材料的颜色分为环境色,漫反射
色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物
体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和
镜面反射色的综合。例如:OpenGL的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在忽略其他反射效果的
情况下,最终进入眼睛的颜色是(LR*MR,LG*MG,LB*MB)。
由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。而计算机只能显示二维图形,
所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了
两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其
中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近
的物体大,离视点远的物体小,通常用于游戏制作。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才
会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。
目前创建三维图像API的标准主要有Microsoft的Direct3D、SGI的OpenGL、Intel的3DR、Apple的QuickDraw-
3DRave、Autodesk的Heidi、Argonaut的Brender和Render Morphics的Reality。其中影响最大的是前两家。Direct3D
和OpenGL的技术各有千秋,相比而言,OpenGL的历史更长一些,也更成熟一些。客观地说,目前在3D图形开发上
OpenGL还是要更胜一筹。但是微软怎会就此罢手呢?2001年7月27日,其公布了最新研制的DirectX 9的部分内幕消
息,据称DirectX 9将是一个全新的.dll文件,这将是一次很值得期盼的升级。它将引进剪裁平面(Scissor Planes)
技术,这并不是专门为游戏而引进的,而是给较复杂的应用程序使用,它将对需要硬件支持的像素矩形修剪,这就是
其名称的意义,把物体放在视野中,然后裁掉看不到的部分。这对于开启多重窗口和剪辑视频而言有很大的帮助。
而这一特性在OpenGL中必须要有某种程度的精确性和硬件支持才能发挥得很好。OpenGL的剪裁和模版印刷功能通常
需要停止对部分屏幕画面的写入动作。
但不管怎么而言,现在OpenGL还是一面屹立不倒的大旗,其版本也在不断升级完善当中。最新的版本为OpenGL
1.3,而在Delphi下通过转换的文件是可以支持OpenGL 1.2的。
下面是Delphi下开发OpenGL的一些利器和必须的装备。大家先去好好看看吧!

http://www.lischke-online.de/Graphics.html#GraphicEx
下载GLScene和OpenGL 1.2 个人以为是Delphi下最好的!
http://www.jet3d.com/download.htm 许多3D开发的好东西!
http://www.multimania.com/netsach/glaux.html BCB下的glaux!
 
换行!换行!换行!换行!换行!换行!换行!换行!换行!换行!换行!换行!换行!
 
正在学习中。。。。。
 
收藏!!
 
图形标准在图形领域有着重要的地位,历史上曾出现的图形标准有Core、GKS、PHIGS、
PEX、GL、Dore、RenderMan、Hoops、OpenGL等等。经过竞争与淘汰,目前OpenGL已成为
国际上公认的3D图形工业标准,并占据了领导地位。SGI公司于1990年开始着手OpenGL的
研制。1992年OpenGL体系结构委员会制定了1.0规范,1995年推出1.1规范。1998年OpenGL 1.2
在SGI平台实现。OpenGL及其应用程序已在Unix与PC平台得到广泛的应用。

图形标准存在显而易见的优点:它不仅加速了3D应用程序的开发,而且使应用程序可
移植性更好。但是标准亦存在着缺点,Andries Van Dam 指出:“标准是很多人经过多年
的努力共同创建的,它的规范与实现总是落后于最新技术。经验表明,绝大多数领域最
先进的设计都是极小数精英小组创作的,但是标准却是一个庞大委员会的技术、政治折衷
的产物”。

OpenGL的发展已近10年,从1.0版本到1.2版本在功能上并无显著的变化。在开发交互式
3D图形应用程序方面,OpenGL存在明显的不足:
⑴ OpenGL与窗口系统无关,不提供任何交互手段,必须由程序员自己编写所有的交互功能。
⑵ OpenGL应用程序绘制性能的优化是程序员面临的较大困难。OpenGL的API非常灵活,
不仅针对硬件与软件的优化方法多而相异,即便对于同一数据结构或算法,如果代码的
组织不同亦会产生性能差异。
⑶ OpenGL 编程接口(API)是低级的C函数,不提供可重用(Reuse)的对象库或者应用
程序框架,开发效率不高。
以上几点表明,除非开发人员既精通图形系统又精通窗口系统编程,否则难以开发出较好的
基于OpenGL的交互式3D应用程序。由于标准不能被轻易创建与修改,它往往跟不上技术的发展
与市场的变化。而3D图形是迅猛发展的领域。为了克服这个困难,人们往往在图形标准之上再
建立更高级的开发工具(3D Toolkit或3D Engine)。

基于OpenGL的著名的开发工具有:
一、OpenInventor
Open Inventor 是从SGI的Iris Inventor发展而来,适合开发面向对象的交互式3D图形应用程序。
其核心是围绕 Scene Graph庞大的C++ 类库,它提供场景编辑、交互式绘制、文件输入输出等功能
以及相应的图形用户界面。Open Inventor是通用的商业化软件,由Open Inventor体系结构委员会
制定标准,可以在多个平台运行。PC平台的Open Inventor由TGS公司开发与销售。
二、Iris Performer
Iris Performer 是高性能实时3D图形开发系统,由SGI公司研制,专用于SGI的高档图形工作站。
Iris Performer 提供高层的场景结构,支持多CPU、场景多层次细节(LOD)管理。不提供用于
3D交互的图形用户界面。
三、OpenGL Optimeizer/Cosmo3D
OpenGL Optimeizer/Cosmo3D 是面向大型CAD/CAE与可视化应用的开发系统,由SGI公司研制。
它可以将大型复杂的造型简化,并快速地绘制。但由于该产品推出时间不长,短期内难以被
广泛采纳。
四、GLUT
GLUT 的核心是个小型的C函数库,这些函数可以创建OpenGL窗口、弹出菜单、响应鼠标事件,
并可以绘制简单的常见几何形体。GLUT 可在X-Window, Windows NT, OS/2等系统下运行,
特别适合于开发不需要复杂界面的OpenGL示例程序。GLUT的源程序是公开的,并且提供了
百余个出色的示例程序,可帮助用户进一步了解OpenGL。

另外,SGI与Microsoft合作的“Fahrenheit计划”[Http1],将综合OpenGL、Direct3D、Open Inventor、
Optimeizer/Cosmo3D的优点,创建更优秀的图形与可视化开发系统,目前尚未有产品推出。
 
学习学习
 
YB_unique真是多面手啊!最近我一直在搞DirectX,准备下半年好好学一下OpenGl,我的感觉
做3D游戏用OpenGl比DirectX3D好一些,YB_unique感觉如何?
 
TO xdzhan :
个人感觉OpenGL更灵活强大! 如果二选一,我倾向于OpenGL ^_^
 
多人接受答案了。
 
㊣ 在下OpenGL刚刚入门,遇到了好多问题,有些问题我是慢慢试着解决的,有时就改动了一点,
问题就解决了,但我不知道为什么这样改;有些问题却怎么解决不了,我想可能是基础没打好,
平时我做东西时,都是照葫芦画瓢,只看到功能实现,对于结构啦,技巧啦不太理解,
请问高手你们学习Delphi & OpenGL 有什么心得体会,请不吝赐教。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部