在运行时列出opengl扩展名

时间:2015-04-09 08:21:32

标签: c++ opengl glew

如何获得一个包含openGl扩展名的列表,我在C ++程序运行时在程序中使用了该列表。澄清一下,我不想在我的平台上提供扩展,我不想要我可以执行的扩展,我想要一个我在代码中使用的扩展列表。这是为了在开始执行之前检查这些扩展是否可用。我正在寻找GLEW,但是GLEW是为了

  

确定目标平台支持哪些OpenGL扩展。

我想要的是一种获取我正在使用的扩展的方法。如果有人不知道运行方式,请告诉我因为也许有用。

另外,我想知道如何确定要使用的最小opengl版本。

3 个答案:

答案 0 :(得分:0)

实际上处理扩展程序的the standard way in-situ :在尝试调用之前测试可用性。

if (GLEW_ARB_vertex_program) 
{ 
  ...  // Do something with ARB_vertex_program
}

更多复杂的OpenGl程序将对几个扩展可用性执行测试,并从中做出决定:

if (GLEW_ARB_vertex_array_object && other stuff)
{
   renderingTechnic = VERTEX;
}
else
{
   renderingTechnic = BEGIN_END;
}

... etc

如果你想要实际使用的扩展名列表,那就太麻烦了。

你必须检测这样的案例:

if (GLEW_ARB_vertex_program && 0) // YOU SHALL NOT PASS
{ 
  ...  // Do something with ARB_vertex_program
}

在这种情况下,您永远不会输入 then-statement ,但您的工具可能难以检测到它。

Code coverage tools在这里执行这种工作,但是在运行时嵌入的用于执行与可用扩展的比较不是一个选项。

看一下输出的symbol table既不是解决方案:

  • 你的exe不包含任何OpenGl函数。
  • OpenGl库中的一个将包含所有可能的(不是可用 nether 使用)函数。

答案 1 :(得分:0)

如果您的代码库不是很大,那么您可以通过搜索" gl_EXT _"," gl_ARB _"等等以及手动检查和一些纪律来执行此操作。之后尝试记录您使用的所有扩展程序。

最低版本;再次,这是在编写代码时您需要知道的非常基本的东西。但在这里我认为使用GLEW可以帮到你。如果内存服务,GLEW使用您可以定义的预处理器宏来设置您期望的OpenGL标准版本。首先将其设置为较低的值(例如1.1),然后查看代码是否编译并运行。如果是这样,那可能是您需要的最低版本。如果没有,则递增版本并重试。

答案 2 :(得分:0)

通常的方法是在开始实际编码之前确定您将使用的扩展名。如果您稍后更改它,您会立即将可用性测试放在接近初始化的位置,以便您可以使用运行时错误消息终止或回退到备用代码路径。

当然首选方法是不使用扩展并坚持使用普通的OpenGL版本配置文件。是的,OpenGL-1.2之后的任何东西都是通过扩展机制加载的,但这并没有使它成为扩展。因此,如果你知道你的程序完全需要OpenGL-3.0才能工作,那么你就可以测试并完成它。