OpenGL ES声称是OpenGL的一个子集,理论上它意味着任何OpenGL ES程序都可以在PC上作为常规OpenGL运行;但是,似乎OpenGL ES对某些函数(glOrtho
vs glOrthof
)的命名约定略有不同。这有关系吗? OpenGL ES应用程序是否仍然可以使用开箱即用的OpenGL GPU /驱动程序或仅重新编译?
答案 0 :(得分:9)
OpenGL ES应用程序是否仍可以使用开箱即用的OpenGL GPU /驱动程序或只重新编译?
没有。有点,但自从你提起glOrtho
,这意味着你在谈论的是ES 1.x而不是2.x,而不是你。 ES 3.0增加了一些新东西;详见底部。
OpenGL ES 1.x不是任何OpenGL版本的子集。它们是一些非常显着的差异。您可能可能能够编码到一个公共子集,但是你会丢掉很多东西。在两个平台上。
ES 2.x与桌面版GL 2.1的相似性更高,但它仍然不是一个合适的子集。例如,glTexImage2D
具有完全不同的行为。在桌面GL下,最后三个参数不会影响纹理的实际格式。在ES 2.0下,它们是定义纹理的实际图像格式。您可以编写一个有效的glTexImage2D
命令,该命令将在ES 2.0和桌面版GL 2.1下执行相同的操作,但您在桌面GL下会丢掉很多操作(例如选择一个大小的内部格式)。
话虽这么说,您通常可以通过抽象来封锁API差异。使用ES 2.0遇到的一个大问题是GLSL。
GLSL ES添加了几个新的关键字,特别是精确限定符。桌面GLSL 1.20(与GL 2.1配对)没有这些关键字。桌面GLSL 1.30和更高版本执行,但这些绑定到GL 3.0 硬件。因此,很难为ES 2.0编写一个着色器,它将在桌面GL 2.1硬件上不加修改地运行。
这当然不是不可克服的。一些明智的#defines,它们本身可以#ifdef为不同的语言,可以使这相当简单。但你仍然需要找到所有这些案例。
最近发布的OpenGL ES 3.0也不是OpenGL 3.3的合适子集,但它比ES 2.0更接近。非常重要的是GLSL 3.30几乎与GLSL ES 3.00完全相同。因此,您可以更轻松地在两者之间交换着色器。
ES 3.0中存在一些不在3.3中的限制,但通常这些限制很容易避免(并且大多数情况下使用它们都是不好的做法)。并且ES 3.0的一些功能在技术上不在GL 3.3中,但它们在GL 3.3的常用核心扩展中(例如ARB_texture_storage,并且ES3_compatibility扩展以增加兼容性)。但现在使用glTexImage2D
实际上在两种情况之间的工作方式相同,这样更容易。现在,互操作更多的是避免两者都无法使用的功能。
答案 1 :(得分:4)
当前版本的OpenGL(4.x)和OpenGL ES(2.x)是相似的,尽管有足够的差异,移植代码只能通过重新编译才能工作。正如@Nicol Bolas指出的那样,OpenGL中有许多功能甚至不存在于OpenGL ES中,而一些API的行为略有不同。此外,平台支持非常不同(即设置渲染上下文等)。
OpenGL ES 2.0实际上并不向后兼容1.x,因为模型从旧的立即模式样式(如OpenGL 2.1和更早版本中所包含的)更改为更现代的基于着色器的模型。
OpenGL v3和v4弃用了许多不合时宜的2.x功能,尽管主要驱动程序保留了兼容模式以继续这种旧的支持。
OpenGL 4.x中的GL_ARB_ES2_compatibility extension有助于将桌面和移动版本更紧密地结合在一起,以便于移植。
glOrtho
与glOrthof
之间的细微差别显然易于管理,但您需要为其他功能编写包装器。