用OpenGL ES替换这些OpenGL函数?

时间:2011-01-11 12:46:36

标签: iphone xcode opengl opengl-es project

我寻找将PC OpenGL应用程序和iPhone App迁移到一个XCode项目中的可能性(为方便起见)。因此,如果我抓住这些源文件的机会,我想将它应用于两个平台,并希望能够从一个项目编译两个平台。我怎么能做到这一点? 有没有办法在XCode 4或3.25中这样做?任何帮助都将受到高度赞赏

编辑:好的,我走了这么远 - 总而言之,它似乎适用于XCode 4。 我唯一的问题是这些openGL / Glut功能,它们不适用于iPhone:

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

如何解决这些问题?

4 个答案:

答案 0 :(得分:3)

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

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

glutSwapBuffers将被你的EAGLContext上的-presentRenderbuffer取代(但听起来你已经这样做了;如果你不这样做,你将无法看到任何东西)。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

  

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

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

过剩的只是调用系统代码,是吗? (wglSwapBuffers,glxSwapBuffers)

试试这个here eglSwapBuffers,也许this book out

抱歉,我没有为您提供更具体的答案。

答案 3 :(得分:1)

非常恼火,因为缺乏看似简单的推送attribs的功能,但是你可以在设置param之前使用glGet来获取某些东西的状态,就像这对我有用:

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);