44

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

  1. 如果我以桌面上的 OpenGL 框架为目标,它会在 OpenGL ES 2.0 环境中不加修改地运行吗?
  2. 如果没有,那么有没有好的模拟器,PC 或 Mac;是否有我可以运行的脚本将我的 OpenGL 代码转换为 OpenGL ES 代码,或者标记那些不起作用的东西?
4

5 回答 5

41

自从我上次做任何 ES 工作以来已经过去了大约三年,所以我可能已经过时或者只是记错了一些东西。

  1. 不,针对桌面的 OpenGL 不等于针对 OpenGL ES,因为 ES 是一个子集。ES 不实现立即模式函数(glBegin()/ glEnd(), glVertex*(), ...) 顶点数组是将内容发送到管道的主要方式。

    此外,这取决于您所针对的配置文件:至少在 Lite 配置文件中,ES 不需要实现浮点函数。相反,您会得到定点函数;考虑 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() 的调用。此外,他们使用宏f2vt()——将浮点数转换为顶点类型——自动将参数从浮点数转换为正确的数据类型。

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


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

  • 今天的平台可能不使用 Lite 配置文件,因此您可能不必担心定点小数
  • 在将您的桌面代码移植到移动设备(例如 iOS)时,很可能您必须主要做这些,而不是其他:
    • 用顶点数组替换glBegin()/glEnd()
    • 将一些对函数glClearColor()的调用替换为诸如glClearColorf()
    • 重写你的窗口和输入系统
    • 如果以 OpenGL ES 2.0 为目标来获得着色器功能,您现在必须用着色器完全替换固定功能管道的内置行为 - 至少是重新实现固定功能管道的基本行为
  • 非常重要:除非您的移动系统不受内存限制,否则您真的想考虑为您的图形芯片使用纹理压缩;例如,在 iOS 设备上,您将上传 PVRTC 压缩数据到芯片
于 2009-07-25T11:08:18.097 回答
4

在新设备使用的 OpenGL ES 2.0 中,您还必须提供自己的顶点和片段着色器,因为旧的固定功能管道已不复存在。这意味着必须自己进行任何着色计算等,这将是相当复杂的事情,但您可以在 GLSL 教程中找到现有的实现。

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

于 2010-01-18T04:48:19.403 回答
4

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

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

  • Regal:ES 2.x 的任何内容。

于 2013-07-16T20:02:08.840 回答
3

据我了解,OpenGL ES 是 OpenGL 的一个子集。我认为如果你避免使用立即模式的东西,比如 glBegin() 和 glEnd() 你应该没问题。在过去的几个月里,我没有对 OpenGL 做太多事情,但是当我使用 ES 1.0 时,只要我不使用 glBegin/glEnd,我从标准 OpenGL 中学到的所有代码都可以工作。

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

这是Windows模拟器。

于 2009-07-24T18:20:01.450 回答
0

选项 3)您可以使用 Qt 之类的库来使用其内置的包装函数来处理您的 OpenGL 代码。这使您可以选择为 OpenGL 使用一个代码库(或最少不同的代码库)并为您想要的大多数平台构建。您不需要为要支持的每个不同平台移植它。Qt 甚至可以根据您使用的函数选择 OpenGL 上下文。

于 2015-11-24T22:06:05.747 回答