我正在开发一个游戏框架,并且是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*x()
函数来替换对gl*f()
函数的调用)。
可以看一下在Trolltech's example中如何解决这个问题(特别是qtwidget.cpp
文件;这是Qt的例子,但还是可以参考一下)。你会看到他们使用了这个调用:
q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));
这是为了替换对glClearColorf()
函数的调用。此外,他们使用宏f2vt()
——表示将浮点数转换为正确的数据类型。
三年前我为一家公司开发一些小演示时,使用了PowerVR的SDK取得了成功。该SDK适用于Windows下的Visual C++;我没有在Linux下试过(因为我是在公司电脑上工作)。
最近我的ES经验有所更新。(2011年6月7日)
glBegin()
/glEnd()
等函数glClearColorf()
的函数替换一些调用glClearColor()
的函数在新设备中使用的OpenGL ES 2.0中,旧的固定管线已经消失,因此您需要提供自己的顶点着色器和片元着色器。这意味着您需要自己进行任何阴影计算等操作,这些操作可能相当复杂,但是您可以在GLSL教程中找到现有的实现。
尽管如此,由于GLES是桌面OpenGL的子集,因此可以在两个平台上运行相同的程序。
选项3)您可以使用Qt这样的库来处理您的OpenGL代码,使用它们内置的包装函数。这为您提供了使用一个代码库(或最小化不同的代码库)来针对OpenGL构建几乎任何平台的选项。您不需要为想要支持的每个不同平台进行端口移植。Qt甚至可以根据您使用的函数选择OpenGL上下文。