我正在开发各种游戏框架,并且是 OpenGL 的新手。大多数书籍似乎都没有对这个问题给出非常明确的答案,我想在我的桌面上使用 OpenGL 进行开发,但在 OpenGL ES 2.0 环境中执行代码。我的问题是双重的:
- 如果我以桌面上的 OpenGL 框架为目标,它会在 OpenGL ES 2.0 环境中不加修改地运行吗?
- 如果没有,那么有没有好的模拟器,PC 或 Mac;是否有我可以运行的脚本将我的 OpenGL 代码转换为 OpenGL ES 代码,或者标记那些不起作用的东西?
我正在开发各种游戏框架,并且是 OpenGL 的新手。大多数书籍似乎都没有对这个问题给出非常明确的答案,我想在我的桌面上使用 OpenGL 进行开发,但在 OpenGL ES 2.0 环境中执行代码。我的问题是双重的:
自从我上次做任何 ES 工作以来已经过去了大约三年,所以我可能已经过时或者只是记错了一些东西。
不,针对桌面的 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()
——将浮点数转换为顶点类型——自动将参数从浮点数转换为正确的数据类型。
三年前,当我为一家公司开发一些小型演示时,我在使用PowerVR 的 SDK时取得了成功。它适用于 Windows 下的 Visual C++;我没有在 Linux 下尝试过(因为我在公司 PC 上工作,所以不需要)。
一个小更新,以反映我最近使用 ES 的经验。(2011 年 6 月 7 日)
glBegin()
/glEnd()
glClearColor()
的调用替换为诸如glClearColorf()
在新设备使用的 OpenGL ES 2.0 中,您还必须提供自己的顶点和片段着色器,因为旧的固定功能管道已不复存在。这意味着必须自己进行任何着色计算等,这将是相当复杂的事情,但您可以在 GLSL 教程中找到现有的实现。
尽管如此,由于 GLES 是桌面 OpenGL 的子集,因此可以在两个平台上运行相同的程序。
据我了解,OpenGL ES 是 OpenGL 的一个子集。我认为如果你避免使用立即模式的东西,比如 glBegin() 和 glEnd() 你应该没问题。在过去的几个月里,我没有对 OpenGL 做太多事情,但是当我使用 ES 1.0 时,只要我不使用 glBegin/glEnd,我从标准 OpenGL 中学到的所有代码都可以工作。
我知道 iPhone 模拟器运行 OpenGL ES 代码。我不确定Android的。
选项 3)您可以使用 Qt 之类的库来使用其内置的包装函数来处理您的 OpenGL 代码。这使您可以选择为 OpenGL 使用一个代码库(或最少不同的代码库)并为您想要的大多数平台构建。您不需要为要支持的每个不同平台移植它。Qt 甚至可以根据您使用的函数选择 OpenGL 上下文。