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

时间:2009-07-24 18:07:50

标签: 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代码,或标记不起作用的东西?

5 个答案:

答案 0 :(得分:39)

我上次做任何ES工作已经有三年了,所以我可能已经过时或只是错误地记住了一些东西。

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

    此外,它取决于您要定位的配置文件:至少在Lite配置文件中,ES不需要实现浮点功能。相反,你得到定点函数;认为32位整数,其中前16位表示小数点前的数字,后面的16位表示小数点后的数字。

    换句话说,如果使用浮点数,即使简单的代码也可能不可移植(您必须使用gl*f()函数调用替换对gl*x()函数的调用。< / p>

    了解如何在Trolltech's example(特别是qtwidget.cpp文件中解决此问题;它是Qt示例,但仍然......)。你会看到他们打这个电话:

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

    这意味着替换对glClearColorf()的调用。此外,它们使用宏f2vt() - 意味着 float到顶点类型 - 它自动将参数从float转换为正确的数据类型。

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


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

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

答案 1 :(得分:4)

在OpenGL ES 2.0中,这是新小工具使用的,你还必须提供自己的顶点和片段着色器,因为旧的固定功能管道已经消失。这意味着必须自己进行任何着色计算等,这些事情会非常复杂,但您可以在GLSL教程中找到现有的实现。

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

答案 2 :(得分:3)

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

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

这是Windows emulator.

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:0)

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