查看: 3256|回复: 10

请教关于OpenGL的版本的问题

[复制链接]

该用户从未签到

发表于 2009-2-28 21:17:08 | 显示全部楼层 |阅读模式
刚开始学习OSG和OpenGL,有几个基本的问题请教一下

1. WindowXP自带的OpenGL运行库是哪个版本的?可以通过OpenGL安装包升级操作系统的OpenGL运行库么?如果有,这个安装包是在哪发布,opengl.org吗?
2. VS2005自带的OpenGL开发库是哪个版本的?(似乎是1.1)怎样升级这个开发库?有SDK安装包么?(opengl.org上没有找到)
3. OSG是基于哪个版本OpenGL的?如果在opengl1.1上编译osg2.8,是否会有功能限制?

谢谢!

该用户从未签到

发表于 2009-2-28 22:36:59 | 显示全部楼层
opengl只是一个标准,没有所谓的SDK,是由显卡厂商的驱动程序提供支持的。由于微软的原因,window系统提供的opengl都是1.1版,并且效率很低。现在使用opengl都是通过扩展函数来使用最新的功能,如ARB,NV,ATI之类的扩展。你用opengl extension viewer 查看你的显卡支持什么扩展,编程的时候就可以使用这些扩展了,比如shader编程。

该用户从未签到

 楼主| 发表于 2009-3-11 17:39:50 | 显示全部楼层
原帖由 flying5 于 2009-2-28 22:36 发表
opengl只是一个标准,没有所谓的SDK,是由显卡厂商的驱动程序提供支持的。由于微软的原因,window系统提供的opengl都是1.1版,并且效率很低。现在使用opengl都是通过扩展函数来使用最新的功能,如ARB,NV,ATI之类的扩展 ...


更不明白了
微软提供的OpenGL实现不是SDK吗? osg在windows上的实现不是在这个SDK基础上开发的么?
osg的高级功能,如shader(opengl1.1似乎连BufferObject都还没有啊),也是使用的这些扩展函数么?没发现有除了opengl32/glu32之外的依赖啊。

该用户从未签到

发表于 2009-3-11 19:49:08 | 显示全部楼层
楼主太抬高微软M$了,首先麻烦您明确这样几个概念:
1、微软对于OpenGL的贡献一无是处!除了开发出一个与之空间规则完全相反的DirectX用来捣乱之外!!(当然DX本身还是无比强大的)
2、OpenGL不能称之为谁谁的SDK,而是一种通用的图形开发标准,最早由SGI提出,多家显示设备制造商联合开发和维护,并且根据自家的特点提出各种各样的扩展功能,使用后缀_NV,_SGI等;而其他厂商则尽力保持自己的显示设备与这些扩展相兼容。

而您的问题可以解释如下:
1、OpenGL运行库的更新是根据显示卡驱动程序的更新来决定的,当我们更新显示卡驱动程序时,通常会自动将OpenGL运行库提升到一个新的版本,目前最新版本为3.0。由于我刚才所说的“联合开发”的性质,因此不必担心哪个厂商的驱动程序不包含OpenGL,因为没有谁敢做这种冒天下之大不韪的事情。
2、VS2005和OpenGL的版本无关,前者只是M$提供的一款IDE环境而已。
3、OSG随时根据OpenGL功能的更新而更新,因此可以说最新的OSG是基于最新的OpenGL的,这也是OSG的优秀之处;不过在低版本OpenGL的系统上使用OSG的基本功能通常问题也不大,只是不少新特性不能实现而已。

OpenGL的运行库只有opengl和glu两个,只要更新显卡驱动,这些运行库本身都会被自动更新。此外注意glut不是OpenGL的运行库!

[ 本帖最后由 array 于 2009-3-11 22:24 编辑 ]

该用户从未签到

 楼主| 发表于 2009-3-11 22:02:25 | 显示全部楼层
多谢斑竹的详细讲述,尤其是运行库的更新方式,与DX是迥然不同的。

三个问题:
1、OSG中对某些OpenGL函数的调用,如glBufferData(应该是OpenGL1.5才有的),是使用wglGetProcAddress(Win32下)的方式。因此无论我的开发库(opengl32.lib glu32.lib 及头文件)是不是最新的,只要运行库是最新的,我都可以在运行时使用到这些新特性。是这样吗?
2、是否有对应OpenGL3.0的开发库?如果没有的话我的OpenGL程序也必须使用wglGetProcAddress的方式么?
3、楼上所说的,各显卡厂商根据自家特点提出的各种扩展功能,它们的使用是否也需要采用类似的方式,需要根据功能库提供函数接口的情况作判断,动态选择实现策略?

再次感谢热情和尽责的阿Ray斑竹

[ 本帖最后由 indif 于 2009-3-11 22:04 编辑 ]

该用户从未签到

发表于 2009-3-11 22:24:06 | 显示全部楼层
1、头文件和运行库都会更新,只要您的显卡支持就不用担心。
2、nVIDIA应该已经推出了支持OpenGL 3.0的显示卡驱动,更新就可以了,如果您打算自己写相关的OpenGL程序的话,那么更新显卡后使用wglGetProcAddress得到函数指针就可以。
3、事实上,某个厂商提出一个扩展,例如GL_MULTISAMPLE_FILTER_HINT_NV,往往会迅速被其他厂商所支持;不过不兼容的事情也常有发生,OpenGL自己没有什么动态选择策略的能力,如果某个扩展不支持会直接返回操作失败。

该用户从未签到

 楼主| 发表于 2009-3-12 09:37:10 | 显示全部楼层
您是说安装显卡驱动的时候,也会更新OpenGL的头文件么?(头文件和lib)是默认安装还是选择安装的呢? 我的ATI3650驱动,没有发现有安装头文件呀?

该用户从未签到

发表于 2009-3-12 10:00:28 | 显示全部楼层
没有什么选择之说,有需要肯定会更新的,不用替它担心~~

该用户从未签到

 楼主| 发表于 2009-3-12 13:14:15 | 显示全部楼层
问题是我的头文件 并没有被更新呀

该用户从未签到

发表于 2009-3-12 13:44:32 | 显示全部楼层
动态链接库(dll/so)会被自动更新的,然后从中取得函数地址就足够了;头文件只是记录宏定义,为了保证程序的正确编译,[b]osg等引擎会自己定义相同作用的宏[/b]。如果实在不爽的话,也可以到opengl.org去下载最新的gl.h和glu.h头文件,不过除非您在自行开发纯粹基于OpenGL的程序,否则这其实毫无意义。

该用户从未签到

 楼主| 发表于 2009-3-12 17:08:57 | 显示全部楼层
在opengl.org找到了glext.h、glxext.h、wglext.h这三个头文件,原来OpenGL1.2以上版本的API都放在glext.h中了,还有版主上面提到了各显卡厂商的扩展功能接口,也都在这三个头文件中。
这样看来,OpenGL1.2以上版本的API以及扩展接口是不可能被包含在导入库(.lib)中的,因此使用这些API的唯一途径只能是wglGetProcAddress(Win32下)的动态获取函数地址的方式,而不能采用链接lib的方式。
这样无疑增加了编程的工作量,但也是OpenGL这种“在开放的OpenGL标准下,各显卡厂商自行开发”方式下的必然选择吧。
与此相对,DirectX则完全是由微软一家开发的标准和实现,而各显卡厂商在此标准下提供硬件和驱动级的实现和支持。因此,是否可以这样说,OpenGL向用户和厂商提供了相同的、开放的、SDK一级的标准;而DirectX则向厂商提供了硬件驱动级的标准,而向用户提供了一个SDK。
我无意比较二者的优劣,只是自己的理解而已。

另外,一个问题:
在使用D3D开发时,程序员经常需要调用API来检查硬件设备是否支持某一功能;而在使用OpenGL开发时,则不会存在相同的问题,因为OpenGL运行库是显卡驱动负责更新的,所以它应该对其硬件(显卡)与软件(OpenGL运行库)的兼容性负责,即只要运行库中有的接口(通过wglGetProcAddress能够获得的),都应该是其硬件能够支持的。 是这样吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表