OpenGL与OpenGL ES 2.0 - OpenGL应用程序可以轻松移植吗?

Hea*_*ser 42 opengl opengl-es emulation opengl-to-opengles

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

  1. 如果我在桌面上定位我的OpenGL框架,它是否会在OpenGL ES 2.0环境中运行而无需修改?
  2. 如果没有,那么那里有一个好的模拟器,PC或Mac; 是否有一个我可以运行的脚本,它将我的OpenGL代码转换为OpenGL ES代码,或标记不起作用的东西?

Iva*_*ica 40

我上次做任何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()- 意味着浮点到顶点类型 - 它自动将参数从float转换为正确的数据类型.

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


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

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