编辑:好的,我已经走得很远——总的来说,XCode 4似乎可以解决这个问题。 我唯一的问题是这些OpenGL / Glut函数,在iPhone上无法使用。
glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT );
glPopAttrib();
glutGet(GLUT_ELAPSED_TIME);
glutSwapBuffers();
有什么办法可以解决这些问题吗?
glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT );
glPopAttrib();
glutGet(GLUT_ELAPSED_TIME);
glutSwapBuffers();
有什么办法可以解决这些问题吗?
PushAttrib/PopAttrib需要被手动跟踪状态的代码替换掉,或者你可以重写代码来设置依赖这些状态的内容。
glutGet(GLUT_ELAPSED_TIME)可以被mach_absolute_time替换(不是非常简单,但这是正确的用法),或者使用[NSDate timeIntervalSinceReferenceDate](相对简单,但存在潜在问题,因为它不能保证单调递增,或每秒以1.0的速度增加)。
glutSwapBuffers将被你的EAGLContext中的-presentRenderbuffer:所替代(但看起来你已经在做这个了;如果没有,你就看不到任何东西了)。
我在网上找到了有关OpenGL ES 1.0规范的文档
应用程序需要查询内部状态的某个类型或另一个类型有几个原因。 应用程序可能需要动态发现实现限制(像素组件大小,纹理尺寸等),或者应用程序可能是分层库的一部分,它可能需要保存和恢复任何作为其渲染的一部分而干扰的状态。 PushAttrib和PopAttrib可用于执行此操作,但它们实现和使用成本高昂,因此不受支持。通常,不建议使用状态查询,因为它们通常对性能有害。与其尝试划分可以查询的不同类型的动态状态(例如矩阵堆栈的顶部),不支持任何动态状态查询,应用程序必须影子状态更改而不是查询管道。这使得分层库变得困难,但没有足够的理由保留动态状态查询或属性推送和弹出。
那么这个其他链接似乎表明您需要自己跟踪那些位。没有帮助。
glut只调用系统代码,对吗?(wglSwapBuffers,glxSwapBuffers)
抱歉我没有更具体的答案。
对于这种看似简单的推送属性功能缺失非常恼人,但是您可以使用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);