我想知道是否有什么工具可以检查您在程序或着色器中使用的扩展(或者您必须检查的最小GL版本)。
类似于:“checkGL目录”,用于获取目录中的程序使用的扩展列表。
输出将类似于:
GL_MIRRORED_REPEAT - GL_VERSION_1_4 - GL_OES_texture_mirrored_repeat
glUseProgram - GL_VERSION_2_0 - GL_ES_VERSION_2_0
glEnableVertexAttribArray - GL_VERSION_2_0 - GL_ES_VERSION_2_0
发布于 2015-01-03 05:34:15
我从未通过编程完成过此操作,但如果您依赖编译器错误并具有解析XML文件的经验,则应该直接这样做。代替实际存在的工具(我不知道),这是您可以自己实现它的方法。
按照正常情况构建程序,但是注释掉所有与GL相关的内容(例如#include <GL/gl.h>
或#include <GL/glew.h>
),然后将编译器错误日志保存到文件中。考虑到这个错误日志,您可以通过解析OpenGL XML注册中心来跟踪缺少的函数和常量需要哪些GL扩展和/或核心版本的GL。
我建议将编译器错误日志解析为GL常量、类型和函数,而不是源代码,因为编译器将通过预处理器运行它,这将消除大量的误报。您可以自己轻松地解析项目目录中的每个.c
、.cpp
、.h
等文件,并查找以gl*
或GL_*
开头的任何内容,但这将天真地包括不活动的代码分支、注释等。
XML注册表是Khronos用于在其站点上生成头部的工具,如果您知道如何解析XML注册表,它将为每个API函数、枚举器、ty胡枝子和扩展提供非常详细的信息。
根据你的例子,你会发现:
<feature api="gl" name="GL_VERSION_1_4" number="1.4">
<require>
...
<enum name="GL_MIRRORED_REPEAT"/>
...
</require>
</feature>
...
<feature api="gles2" name="GL_ES_VERSION_2_0" number="2.0">
<require>
...
<enum name="GL_MIRRORED_REPEAT"/>
...
</require>
</feature>
这意味着在"gl“(桌面GL)中,GL_MIRRORED_REPEAT
在版本1.4中是核心,在"gles2”(OpenGL ES 2.0+)中是核心。
注意不要对标签"gles2“进行过多的解读(这是OpenGL ES的一个分支,其中包含了es2.0或更高版本,解析实际的name
和number
以找出版本需求)。
如果您知道核心常量GL_MIRRORED_REPEAT
的枚举值,那么您可以查找所有具有相同值的其他枚举,并将它们追溯到提升到core的相应扩展。
交叉引用提供GL_MIRRORED_REPEAT
(0x8370)的所有扩展:
<enums namespace="GL" start="0x8370" end="0x837F" vendor="HP">
<!-- NOTE: IBM is using values in this range, because of a
bobble when an employee left DEC for IBM at the same
time as they were assigned the range. their registry
became inconsistent. It's unknown whether HP has any
conflicts. They have never reported using any values in
this range. Lesson: assigned ranges belong to vendors,
not engineers! -->
<enum value="0x8370" name="GL_MIRRORED_REPEAT"/>
<enum value="0x8370" name="GL_MIRRORED_REPEAT_ARB"/>
<enum value="0x8370" name="GL_MIRRORED_REPEAT_IBM"/>
<enum value="0x8370" name="GL_MIRRORED_REPEAT_OES"/>
<unused start="0x8371" end="0x837F" vendor="HP"/>
</enums>
...
<extension name="GL_ARB_texture_mirrored_repeat" supported="gl">
<require>
<enum name="GL_MIRRORED_REPEAT_ARB"/>
</require>
</extension>
<extension name="GL_IBM_texture_mirrored_repeat" supported="gl">
<require>
<enum name="GL_MIRRORED_REPEAT_IBM"/>
</require>
</extension>
<extension name="GL_OES_texture_mirrored_repeat" supported="gles1">
<require>
<enum name="GL_MIRRORED_REPEAT_OES"/>
</require>
</extension>
在这种情况下,GL_MIRRORED_REPEAT
由GL_ARB_texture_mirrored_repeat
和GL_IBM_texture_mirrored_repeat
在GL中提供,GL_OES_texture_mirrored_repeat
在GLE1.x中提供(它是ES2.0中的核心)。
关于确定GLSL着色器的最小版本号,没有XML文件可以解析。唯一真正节省的好处是,如果您将#version ...
指令设置得太低,大多数GLSL编译器都会在着色器信息日志中的错误/警告中包含所需的版本和/或扩展。
您最好的选择是使用GLslang
(OpenGL参考编译器)来使用110 (桌面GL)和100 (OpenGL ES)的强制版本来验证您的着色器。它不像供应商GLSL编译器那样完整,但是它的输出始终是一致的,不管您使用的是什么GPU,并且您应该能够为它编写一个解析器。
更新:
我在几个小时内完成了一个项目,大致完成了您想要的,这是一些示例输出:
Enter OpenGL name to search for: GL_MIRRORED_REPEAT
--------------------------------
>> Enum: GL_MIRRORED_REPEAT is 0x8370
* Core in GL_VERSION_1_4 ( gl 1.4)
* Core in GL_ES_VERSION_2_0 (gles2 2.0)
>> Enum Alias: GL_MIRRORED_REPEAT_ARB <<
* Provided by GL_ARB_texture_mirrored_repeat (gl)
>> Enum Alias: GL_MIRRORED_REPEAT_IBM <<
* Provided by GL_IBM_texture_mirrored_repeat (gl)
>> Enum Alias: GL_MIRRORED_REPEAT_OES <<
* Provided by GL_OES_texture_mirrored_repeat (gles1)
Enter OpenGL name to search for: glEnableVertexAttribArray
--------------------------------
>> Command: void glEnableVertexAttribArray (GLuint index)
* Core in GL_VERSION_2_0 ( gl 2.0)
* Core in GL_ES_VERSION_2_0 (gles2 2.0)
>> Command Alias: glEnableVertexAttribArrayARB <<
* Provided by GL_ARB_vertex_program (gl)
此项目的源代码可在GitHub 这里上获得。
https://stackoverflow.com/questions/27733028
复制相似问题