【问题标题】:Replace these OpenGL functions with OpenGL ES?用 OpenGL ES 替换这些 OpenGL 函数?
【发布时间】:2011-01-11 12:46:35
【问题描述】:

我寻找将我的 PC OpenGL 应用程序和一个 iPhone 应用程序迁移到一个 XCode 项目中的可能性(为了方便)。因此,如果我有机会获得这些源文件,我想将其应用于两个平台,并希望能够从一个项目中为两个平台进行编译。我怎么能做到这一点? 有没有办法在 XCode 4 或 3.25 中这样做?任何帮助将不胜感激

编辑:好的,我到目前为止 - 总而言之,它似乎适用于 XCode 4。 我唯一的问题是这些 openGL/Glut 函数在 iPhone 上不起作用:

glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT );
glPopAttrib();
glutGet(GLUT_ELAPSED_TIME);
glutSwapBuffers();

有解决这些问题的方法吗?

【问题讨论】:

  • 虽然不是特定于 OpenGL 应用程序,但这个问题提出了类似的问题:Same code base for iPhone/Desktop app
  • 您最好在 GL ES 中编写引擎,然后为 PC 提供 OpenGL 等效项...
  • 在不违反 NDA 的情况下,是否需要 Xcode 4 中的新功能来创建针对这两个平台的项目?

标签: iphone xcode opengl opengl-es project


【解决方案1】:

PushAttrib/PopAttrib 您需要将自己替换为手动跟踪这些状态的代码,或者您可以重写您的代码,以便任何依赖这些状态的东西自行设置它们。

glutGet(GLUT_ELAPSED_TIME) 可以替换为 mach_absolute_time (不是特别容易,但使用正确)或 [NSDate timeIntervalSinceReferenceDate] (简单,但可能有问题,因为它不能保证单调增加,或者以每 1.0 倍的速度增加第二)

glutSwapBuffers 将被替换为 -presentRenderbuffer: 在您的 EAGLContext 上(但听起来您已经在这样做了;如果您不这样做,您将看不到任何东西)。

【讨论】:

    【解决方案2】:

    您可以使用dgles 包装您的桌面 OpenGL 实现并提供 OpenGL ES 1.x 接口。

    【讨论】:

      【解决方案3】:

      我发现这个documentation online 与 OpenGL ES 1.0 规范有关

      应用程序需要查询一种或另一种内部状态的原因有多种。应用程序可能需要动态发现实现限制(像素组件大小、纹理尺寸等),或者应用程序可能作为分层库的一部分,它可能需要保存和恢复它在渲染过程中干扰的任何状态。PushAttrib 和PopAttrib 可用于执行此操作,但它们的实现和使用成本很高,因此不支持。一般来说,不鼓励状态查询,因为它们通常不利于性能。与其尝试划分可以查询的不同类型的动态状态,例如矩阵堆栈的顶部,不支持动态状态查询,应用程序必须影子状态更改而不是查询管道。这使得分层库的事情变得困难,但是没有足够的理由来保留动态状态查询或属性推送和 po啪啪啪。

      这和other link here 似乎表明您需要自己跟踪这些位。那里对你没有帮助。

      glut 只是调用系统代码,是吗? (wglSwapBuffers, glxSwapBuffers)

      试试这个here eglSwapBuffers 或者this book out

      抱歉,我没有更具体的答案。

      【讨论】:

        【解决方案4】:

        对缺乏看似简单的推送属性功能感到非常恼火,但您可以在设置参数之前使用 glGetto 获取某物的状态,就像这样对我有用:

        Boolean tmpB;
        int tmpSrc,tmpDst;
        
        glGetBooleanv(GL_BLEND,&tmpB);
        glGetIntegerv(GL_BLEND_SRC_ALPHA,&tmpSrc);
        glGetIntegerv(GL_BLEND_DST_ALPHA,&tmpDst);    
        
        
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        //draw rectangle
        CGSize winSize=[[CCDirector sharedDirector] winSize];
        CGPoint vertices[] = { ccp(0,0), ccp(winSize.width,0), ccp(winSize.width,20), ccp(0,20) };
        glColor4ub(255, 0, 255, 55);
        ccFillPoly( vertices, 4, YES);
        
        
        if(!tmpB)
            glDisable(GL_BLEND);
        
        glBlendFunc(tmpSrc, tmpDst);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-29
          • 2011-06-16
          相关资源
          最近更新 更多