代码之家  ›  专栏  ›  技术社区  ›  Heat Miser

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

  •  42
  • Heat Miser  · 技术社区  · 17 年前

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

    1. 如果我把OpenGL框架放在桌面上,它会在OpenGL ES 2.0环境中运行而不进行修改吗?
    2. 如果没有,那么有没有一个好的模拟器,PC或Mac;是否有一个脚本,我可以运行,将我的OpenGL代码转换为OpenGL ES代码,或标记的东西将无法工作?
    5 回复  |  直到 17 年前
        1
  •  41
  •   feedc0de RushPL    10 年前

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

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

      此外,这取决于您所针对的配置文件:至少在Lite配置文件中,ES不需要实现浮点函数。取而代之的是定点函数;考虑32位整数,其中前16位表示小数点前的数字,后16位表示小数点后的数字。

      换句话说,即使是简单的代码 可以 gl*f() 具有对的调用的函数 gl*x() 功能。

      看看你可以如何解决这个问题 Trolltech's example (特别是 qtwidget.cpp 档案;这是Qt示例,但仍然。你会看到他们打了这个电话:

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

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

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


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

    • 在为移动设备(如iOS)移植桌面代码时,您很可能需要主要完成以下几项工作,而不需要做太多其他工作:
      • 代替 glBegin() / 格伦德() 使用顶点数组
      • 替换对函数的某些调用,例如 glClearColor() glClearColorf()
      • 重写窗口和输入系统
      • 如果以OpenGL ES 2.0为目标来获得着色器功能,您现在将 用着色器完全替换固定函数管道的内置行为-至少是重新实现固定函数管道的基本着色器
    • 真的很重要:除非你的移动系统没有内存限制,否则你真的想在你的图形芯片上使用纹理压缩;例如,在iOS设备上,您将向芯片上载PVRTC压缩数据
        2
  •  4
  •   Tronic    16 年前

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

        3
  •  4
  •   lunixbochs    10 年前

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

    • glshim :大量固定管道至1.x支架,基本ES 2.x支架。

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

        4
  •  3
  •   Mohsin Khubaib Ahmed    10 年前

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

    我知道iPhone模拟器运行OpenGL ES代码。我不确定安卓那一个。

    这是 Windows emulator.

        5
  •  0
  •   steventaitinger    10 年前

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