OpenGL与OpenGL ES 2.0 – OpenGL应用程序是否可以轻松移植?

我正在研究各种游戏框架,并且是OpenGL的新手。 大多数书似乎没有给出一个非常明确的答案这个问题,我想在我的桌面上使用OpenGL开发,但在OpenGL ES 2.0环境中执行代码。 那么我的问题是双重的:

  1. 如果我将OpenGL的框架定位在桌面上,它会在OpenGL ES 2.0环境中运行吗?
  2. 如果没有,那么是否有一个好的模拟器,PC或Mac; 是否有一个脚本,我可以运行,将我的OpenGL代码转换成OpenGL ES代码,或标记的东西,将无法正常工作?

自从我上一次做ES工作已经有三年了,所以我可能会过时,或者只是不正确地记住一些东西。

  1. 不,针对桌面的OpenGL不等于针对OpenGL ES,因为ES是一个子集。 ES没有实现即时模式函数( glBegin() / glEnd()glVertex*() ,…)顶点数组是向stream水线中发送东西的主要方式。

    另外,它还取决于你所指定的configuration文件:至less在Liteconfiguration文件中,ES不需要实现浮点function。 相反,你会得到定点function; 认为32位整数的前16位是小数点前的数字,后面的16位是小数点后的数字。

    换句话说,即使简单的代码可能是不可移植的,如果它使用浮动(你必须调用gl*f()函数调用gl*x()函数。

    看看你如何解决这个问题在Trolltech的例子 (特别是qtwidget.cpp文件;这是Qt的例子,但仍…)。 你会看到他们打这个电话:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    这是为了取代对glClearColorf()的调用。 此外,他们使用macrosf2vt() – 意味着浮点到顶点types – 自动将参数从float转换为正确的数据types。

  2. 在三年前为一家公司开发一些小型演示的时候,我已经成功地使用了PowerVR的SDK 。 它适用于Windows下的Visual C ++; 我没有在Linux下尝试过(因为我在公司PC上工作,所以没有必要)。


一个小的更新,以反映我最近与ES的经验。 (2011年6月7日)

  • 今天的平台可能不使用Liteconfiguration文件,所以您可能不必担心定点小数
  • 当移植你的桌面代码的移动(例如iOS),很可能你将不得不做主要这些,而不是其他:
    • 用顶点数组replaceglBegin() / glEnd()
    • 用诸如glClearColor()的调用replaceglClearColor()等函数,
    • 重写你的窗口和input系统
    • 如果以OpenGL ES 2.0为目标以获得着色器function,则现在必须用着色器完全替代固定functionstream水线的内置行为 – 至less基本的是重新实现固定functionstream水线
  • 真正重要的是:除非你的移动系统没有内存限制,否则你真的想要考虑使用纹理压缩为你的graphics芯片; 例如,在iOS设备上,您将上传PVRTC压缩数据到芯片

在OpenGL ES 2.0中,这是新的小工具使用,你也必须提供自己的顶点和片段着色器,因为旧的固定functionpipe道不见了。 这意味着必须自己做任何阴影计算等,这些事情会非常复杂,但是您可以在GLSL教程中find现有的实现。

不过,由于GLES是桌面OpenGL的一个子集,因此可以在两个平台上运行相同的程序。

我知道两个在桌面和ES之间提供GL翻译的项目:

  • glshim :对1.x支持的基本固定pipe道,基本的ES 2.x支持。

  • 富豪 :任何ES 2.x.

从我的理解来看,OpenGL ES是OpenGL的一个子集。 我想如果你不使用即时模式的东西,如glBegin()和glEnd()你应该没问题。 在过去的几个月中,我没有用OpenGL做过多的工作,但是当我使用ES 1.0时,只要我没有使用glBegin / glEnd,我从标准OpenGL中学到的所有代码都可以工作。

我知道iPhone模拟器运行OpenGL ES代码。 我不确定Android的。

这里是Windows模拟器。

选项3)你可以使用类似Qt的库来处理你的OpenGL代码,使用它们内置的包装函数。 这使您可以select使用一个代码库(或基本不同的代码库)用于OpenGL,并为大多数任何平台构build。 您不需要为每个您想要支持的平台移植它。 Qt甚至可以根据您使用的函数selectOpenGL上下文。