我一直在尝试编写一些可以在任何地方运行的opengl代码,但不要过多限制自己.我想在仅支持它的设备上使用opengles2,并在支持的情况下使用opengl核心.
此外,我希望能够在运行时选择我使用的那个(当然,如果可用的话).
我的问题是:
如果我每次将代码与OpenGL库链接,然后创建GLES2或GL核心上下文,GLES2上下文的行为是否与GLESv2库完全相同?这会是什么影响,标题明智?
例如,GLESv2没有定义BGRA纹理格式,所以我想我必须将所有格式转换为RGBA.这不是什么麻烦,但我有兴趣知道替代品.
我曾想过动态加载库并加载所有使用过的函数指针,但对于可能有更简单答案的东西来说,这是一项巨大的工作.
在这种情况下,我只需要包含glext.h,并声明所用函数的所有函数指针,并填充它们.
这里的问题是glext没有定义任何数据类型(glenum等),所以我总是要包含gl.h.
通过包含两者,我得到gl.h函数声明和我自己的函数指针声明,所以我不能只使用函数指针的通用命名空间…即使这样,一些函数(如glGetError)似乎不有一个关联的typedef作为他们的函数指针.
我知道GLEW,但不幸的是,大多数Linux发行版都发布了一个仍然不兼容GLES2的GLEW版本(debian,我在看你).它只是段错误.
你们这样做怎么样? opengl函数链接的任何其他方法?
最佳答案 我在航空航天工业,我开始使用各种OpenGL子集,因为每个硬件提供商都有自己的版本. (我希望能够完整记录……好吧……任何东西.)看来我们确实有类似的问题.我会告诉你到目前为止我学到的东西.
首先,您将希望发展成为您可以获得的所有配置文件中最大的最佳超集.使用硬件供应商提供的最新版本的OpenGL标头.这样你的程序至少可以解决编译部分.
BGRA宏/枚举将成为您的GLESv2运行时的一部分,但如果您的平台仅支持RGBA,您肯定永远不会在运行时使用它.
基于平台功能的运行时决策基于OpenGL扩展列表.将扩展列表与应用程序使用的任何内容进行比较,停用不支持的分支并激活支持的分支.您可以通过这种方式区分OpenGL和GLES.