游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3501|回复: 4

初学OpenGL,有很多问题不清楚,虚心请教大家

[复制链接]

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2009-9-6 00:36:00 | 显示全部楼层 |阅读模式
问题:
1.我装了最新的显卡驱动和WindowsSDK(以前称为PlatForm SDK),用GPU Caps Viewer软件查看,能看到显卡现在支持OpenGL 3.1(附件中的图,未安装最新驱动之前只支持OPENGL 2.0),那么我想问下,在开发OPENGL程序的时候,时候只需要再在程序中用最新的OPENGL 3.0的头文件就可以支持最新的3.0 API?
2.在安装了最新的驱动和WindowsSDK(以前称为PlatForm SDK)以后,我查看Windows/System32/opengl32.dll文件,发现这个文件没有任何更新。那么如果我要调用新的Opengl 3.0中的API(当然在程序中包含最新的OpenGL 3.0头文件),是否能成功?
3.用NeHe的教程代码Lesson6做例子,用VC++ 2008 打开并转换工程,查看工程属性,可以看到在连接器属性的输入项中,Additional Dependence 引用的是:opengl32.lib,glu32.lib,odbc32.lib,odbccp32.lib 4个库。时候意味着我们不需要opengl32.dll也可以运行程序?因为用的是静态库连接方式?
4.如果删除掉Windows/System32/opengl32.dll文件,编译NeHe的教程代码Lesson6并运行后,Windows/System32/中又会出现新的opengl32.dll,而且跟之前删除的一摸一样(创建时间和文件长度),有清楚幕后的同学能指导下到底发生了什么?
5.我在跟新显卡驱动和WindowsSDK之前,运行NeHe的Lesson6,FPS大概在40左右,更新驱动以后,帧率超过500以上(没有实际计算过),是因为WindowsSDK的原因还是新显卡驱动的原因?


以上问题一直困扰着我。。跪求答案,谢谢!!!

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2009-9-6 00:42:00 | 显示全部楼层

Re: 初学OpenGL,有很多问题不清楚,虚心请教大家

额,对于问题5,我似乎找到答案了:

OpenGL硬件加速

  在Windows平台上,OpenGL驱动可能有三种模式:纯软件、MCD和ICD:

纯软件模式:微软提供一个OpenGL的软件实现,所有渲染操作均由CPU完成,速度很慢。如果安装系统时使用Windows自带的显卡驱动程序,那么 OpenGL程序就会运行在软件模式下。而且由于微软有自己的Direct3D,所以对OpenGL的支持很消极,它的OpenGL纯软件实现只支持 OpenGL1.1,而目前OpenGL的最新版本为1.4

MCD(Mini Client Driver):MCD是早期微软在Windows NT上支持OpenGL时,为了简化驱动开发时使用的一个模型。在这个模型中,OpenGL渲染管线的变换、光照部分仍然由软件实现,而光栅化部分则由硬件厂商实现,因此只要硬件支持,MCD可以硬件加速光栅化部分。MCD虽然可以简化驱动开发,但是功能限制太大,现在市面上的3D加速卡均支持硬件变换和光照,MCD却不能利用这一特性,看上去MCD已经没有存在的价值

ICD(Installable Client Driver):ICD是一个完整的OpenGL驱动模型,比MCD复杂得多。硬件厂商要实现完整的OpenGL渲染管线,如变换、光照、光栅化等,因此只要硬件支持,ICD可以硬件加速整个OpenGL渲染管线。我们通常说的OpenGL硬件加速就是指的通过ICD模型获得的硬件加速,而现在硬件厂商提供的OpenGL驱动程序也都是依照ICD模型开发的。主要硬件厂商的ICD已经可以支持OpenGL的最新版1.4



  Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如在Windows 2000下安装nVIDIA GeForce2 MX的驱动程序,会在系统目录下放一个nvoglnt.dll(这就是nVIDIA的OpenGL驱动),并在注册表中登记nvoglnt.dll,让 Windows知道硬件加速OpenGL驱动的名字,以后运行OpenGL程序,OpenGL32.dll就会把OpenGL调用直接转到 nvoglnt.dll。



Windows平台上,一个OpenGL程序是否使用硬件加速由三个因素决定,这三个因素缺一不可,否则程序都会运行于纯软件模式:

是否有一块3D加速卡

是否安装了显卡厂商提供的最新的驱动程序,Windows自带的显卡驱动程序并不会提供OpenGL硬件加速能力

指定的像素格式是否被显卡硬件所支持

判断一种像素格式是否被显卡硬件所支持,可以用函数DescribePixelFormat取得该像素格式的数据,然后看结构体PIXELFORMATDESCRIPTOR中的dwFlags的值,如果

PFD_GENERIC_FORMAT被置1,并且PFD_GENERIC_ACCELERATED被置0,即
(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
!(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明该像素格式不被显卡硬件支持,使用该像素格式的OpenGL程序将使用纯软件模式渲染

PFD_GENERIC_FORMAT被置1,并且PFD_GENERIC_ACCELERATED被置1,即
(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明该像素格式被显卡硬件支持,并且程序使用MCD模式渲染

PFD_GENERIC_FORMAT被置0,并且PFD_GENERIC_ACCELERATED被置0,
!(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
!(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明该像素格式被显卡硬件支持,并且程序使用ICD模式渲染

等待其他的回答

2

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2009-9-22 16:50:00 | 显示全部楼层

Re:初学OpenGL,有很多问题不清楚,虚心请教大家

1、使用glext.h就可以支持新版本的OpenGL功能。
使用glext时,扩展函数需要定义一个指针并通过glext的方法得到函数指针,在使用之前需要先在程序中判断一下功能能否在当前硬件环境下运行。也可以使用glew或者glee,这些库把扩展函数都声明好了,只需要判断一下硬件是否支持就可以调用。
2、你的回复文章里面已经提到了nvoglnt.dll了,那么n卡的opengl功能随着显卡驱动的更新而更新这个文件,新功能只要驱动支持自然可以调用成功
3、使用了lib不一定是静态库,动态链接库的静态调用也是这样链接的,所以我觉得背后还是会调用OpenGL32.dll
4、我没试过,或许是Windows的系统文件保护机制吧,文件被删除后自动从dll cache里面快速恢复了一份出来

14

主题

251

帖子

251

积分

中级会员

Rank: 3Rank: 3

积分
251
发表于 2009-9-22 17:58:00 | 显示全部楼层

Re:初学OpenGL,有很多问题不清楚,虚心请教大家

up

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2009-9-23 10:00:00 | 显示全部楼层

Re:初学OpenGL,有很多问题不清楚,虚心请教大家

多谢3楼的回答!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-6 07:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表