Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL版本和GPU-有什么样的兼容性?_Opengl - Fatal编程技术网

OpenGL版本和GPU-有什么样的兼容性?

OpenGL版本和GPU-有什么样的兼容性?,opengl,Opengl,我试图了解图形卡版本、OpenGL版本和API头是如何协同工作的。我已经在OpenGL论坛和其他地方读到了OpenGL 2.0/3.0/3.1崩溃的消息,但作为一名开发人员(OpenGL新手),我仍然不清楚这将如何解决。(顺便说一句,我在这个问题上使用nVidia作为一个例子,因为我正在购买他们的一张卡,但显然我希望对我开发的软件不依赖供应商) 首先,GPU需要支持OpenGL版本。但例如,nVidia有支持OpenGL 3的旧视频卡驱动程序。这是否意味着这些驱动程序在软件中实现某些功能,以模拟

我试图了解图形卡版本、OpenGL版本和API头是如何协同工作的。我已经在OpenGL论坛和其他地方读到了OpenGL 2.0/3.0/3.1崩溃的消息,但作为一名开发人员(OpenGL新手),我仍然不清楚这将如何解决。(顺便说一句,我在这个问题上使用nVidia作为一个例子,因为我正在购买他们的一张卡,但显然我希望对我开发的软件不依赖供应商)

首先,GPU需要支持OpenGL版本。但例如,nVidia有支持OpenGL 3的旧视频卡驱动程序。这是否意味着这些驱动程序在软件中实现某些功能,以模拟硬件中没有的新功能

然后是API头。如果我决定为OpenGL 3编写一个应用程序,我是否应该等到Microsoft发布一个更新版本的平台SDK,其中包含支持此版本的标题?如何选择使用哪个版本的API?通过代码中定义的预处理器,或者更新到最新的平台SDK只是升级到最新版本(无法想象最后一个选项,但您永远不知道…)

向后兼容性如何?如果我编写了一个针对OpenGL 1.2的应用程序,为支持OpenGL 3的卡安装了驱动程序的用户是否仍然能够运行它,或者我应该在我的应用程序中测试卡的功能/支持的版本?阅读似乎证实了至少针对nVidia卡编写的针对1.2的应用程序将继续工作,但这也意味着其他供应商可能会停止支持1.2 API。基本上,这将使我(潜在地)在未来的位置上,软件将无法与最近的卡一起工作,因为它们不再支持1.2。但如果我现在为OpenGL3甚至2开发,我可能会拒绝那些gpu只支持1.2的用户

我不需要OpenGL中的奇特功能——我几乎不使用任何着色,固定管道对我来说很好(我的应用程序类似于CAD)。什么是新应用程序的最佳基础版本,并期望它将是一个长寿命的应用程序,并在未来几年进行增量更新


我可能忘记了与此相关的其他问题,任何见解都是值得赞赏的。

就驱动程序而言,我认为在某些情况下,它缺少用软件编写的功能。使用OpenGL(除了加速之外)的全部目的是编写API,而不管它是如何实现的

根据我的经验,您不需要声明OpenGL版本。API版本之间的函数调用不重叠。请注意规范,例如,如果调用2.0方法,则应用程序的最低版本将变为2.0。我有针对OpenGL(愚蠢的旧Sun视频卡)编写的显示应用程序,它在全新的nvidia 200系列卡上运行良好


我认为无论如何也不能保证api在将来不会改变;尤其是如果你不能控制它。当我们使用OpenGL 6.4时,您的应用程序可能会在10年后停止工作。希望您已经编写了一个足够好的应用程序,客户会愿意为升级付费。

根据我的OpenGL经验,“定位”给定版本似乎只是访问为该版本添加的各种扩展。因此,将OpenGL版本3作为“目标”的唯一原因是,如果您想使用版本3中新增的一些扩展。如果您没有真正使用版本3扩展(如果您只是在做基本的OpenGL工作),那么您自然不会“瞄准”版本3

在Visual Studio中,您将始终使用opengl32.lib链接应用程序,并且opengl32.lib不会在不同的OpenGL版本之间更改。OpenGL使用wglGetProcAddress()在运行时而不是编译时动态访问OpenGL扩展/版本。也就是说,如果给定的驱动程序不支持扩展,那么当请求该扩展的过程时,wglGetProcAddress()将在运行时返回NULL。因此,在代码中,您需要实现处理NULL返回情况的逻辑。在最简单的情况下,您可以打印一个错误并说“此功能不可用,因此此程序将运行…”。或者,您可以找到其他替代方法来完成不使用扩展的相同操作。在大多数情况下,如果应用程序运行在不支持添加所需扩展的OpenGL版本的旧硬件/驱动程序上,则只能从wglGetProcAddress获得NULL返回。然而,在未来的几年里,你会想要跟上那些新的OpenGL版本决定不推荐的东西。我对3.1规范没有太多的了解,但很明显,他们引入了一个弃用模型,旧的技术/扩展可能会被弃用,这将为新的硬件/驱动程序打开大门,不再支持弃用的扩展,在这种情况下,wglGetProcAddress将再次为这些扩展返回NULL。因此,如果您在wglGetProcAddress()上放入处理NULL返回的逻辑,即使对于不推荐使用的扩展,您也应该没有问题。您可能需要实现更好的替代方案,或者将更新的扩展设为默认

就版本化的API头而言,对头的更改主要是为了允许访问wglGetProcAddress()返回的新函数。因此,如果您包含版本2的API头,只要您只需要OpenGL2的扩展,就可以继续使用。如果需要访问在版本3中添加的函数/扩展,则只需将版本2标头替换为版本3标头,这只需添加一些与新扩展关联的附加函数指针typedef,以便在调用wglGetProcAddress()时,可以将返回值强制转换为正确的函数指针。例如:

PFNGLGENQUERIESARBPROC glGenQueriesARB = NULL;

...

glGenQueriesARB = (PFNGLGENQUERIESARBPROC)wglGetProcAddress("glGenQueriesARB");
在上述ex中