对于我的应用程序,我需要一个渲染器。渲染器将OpenGL 3.3核心配置文件用作基本。在较新的OpenGL版本中,有一些整洁的功能,也可以通过扩展名获得。如果可用,我想根据最新的OpenGL版本使用较新的功能。由于测试可用版本并调整加载程序是一团糟,因此我决定保留在Core 3.3上,并在可用的地方使用扩展名(因为这是扩展名,对吗?(。
在较新的OpenGL版本中的扩展速度与相同的功能一样快?
让我们以GL_ARB_direct_state_access
-延迟。自4.5以来,可通过直接状态访问提供核心。后者比前者快吗?IE。在新版本中实现的功能是否比扩展更快?还是驱动程序链接到同一功能?
e:这不是关于软件设计的问题,而不是关于如何处理扩展(主要是?(和性能的问题。
实际上,OpenGL API规格XML描述具有alias
的不错属性。一个与另一个函数混为一由的gl函数基本上在语法上和语义上与它的函数相同 - 当扩展函数促进到核心功能并更改其名称时,此功能经常使用。
那里有GL装载机实际使用该信息。我知道的两个例子是:
- libepoxy
- GLAD2(Glad2是Glad Loader Generator的当前开发部门 - 但是我从2年以来就使用了它,没有任何问题(。您必须明确启用混叠功能。还有一个Web服务,可让您生成所需的文件(请注意底部的"混叠"按钮(。还要查看"高兴的文档"。
使用这样的加载程序,您不必关心特定功能是来自扩展名还是来自GL核心功能,只要以某种方式使用它们。
还要注意,随着较新的扩展,OpenGL ARB通常是在功能和枚举名称上创建没有ARB
后缀的ARB扩展名,这意味着在任何情况下,它都描述了完全相同的实体。这基本上是针对在之后创建的扩展程序完成的,这些功能已合并到核心标准中。他们只是为其创建一个扩展名,以便可能无法满足新标准版本的其他要求的供应商仍然可以提供ISLTECTAINS。
第一个示例之一是GL_ARB_sync
扩展名,它本身与第13期:
13(为什么入口点/枚举不附加
ARB
?此功能直接进入OpenGL 3.2核心 并且也被定义为旧>平台的扩展 同时,它不使用ARB后缀,例如其他 新功能直接进入GL核心。
您写道:
让我们以
GL_ARB_direct_state_access
-extension。自4.5以来,可通过直接状态访问提供核心。后者比前者快吗?IE。在新版本中实现的功能是否比扩展更快?还是驱动程序链接到同一功能?
GL_ARB_direct_state_access
与GL_ARB_sync
属于同一类别。GL功能是通过名称识别的,两个具有相同名称的实体意味着它们引用了非常相同的事物。(您不能在库中以相同名称导出两个不同的函数,而*glGetProcAddress
也仅以名称字符串作为输入,因此如果有多个版本,则无法决定哪个版本(。
但是,这仍然取决于您的GL加载Meachanism如何处理这种情况,因为它可能不会尝试加载您所获得的GL版本所隐含的功能。例如,如果选择它生成a> = 4.5加载程序或支持GL_ARB_direct_state_access
扩展程序,则GARG2将工作。
由于测试可用版本并调整加载程序是一团糟,[...]
很好。这将在很大程度上取决于您正在使用的装载机。正如我所表明的,不仅在绝对相同的函数名称的情况下,而且具有混蛋功能。
是扩展的速度,与较新的OpenGL相同 版本
扩展名是该功能的预览。当新版本到达时,标准中包含许多(大多数?(扩展名,因此性能将相等。
您应该查看目标平台。当我运行OpenGL扩展名查看器时,它告诉我的HD3000支持3.2/3.3和4.0的21%的所有功能。因此,您可以通过要使用的硬件和驱动程序在目标平台上实现所需的功能,以便提前检查。最近的硬件将支持4.4/4.5,因为它已经存在了多年。由您决定您的后退兼容性多少。
自Skylake及其以外的Intel图形上,Skylake自08/2015以来就会出现。所有AMD/NVIDIA硬件还将支持4.4/4.5。请注意,支持级别可能非常在OS和驱动程序版本之间。