2011-01-11 60 views
3

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

编辑:好吧,我走得这么远 - 总而言之,它似乎与XCode 4一起工作。 我唯一的问题是这些OpenGL/Glut函数,它们不适用于iPhone:

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

任何想法如何解决这些问题?

+0

虽然不特定的OpenGL应用程序,这个问题提出了类似的问题:[相同的代码为iPhone /桌面应用程序基地](http://stackoverflow.com/questions/4617166/same-code-base-for-iphone-desktop-app) – 2011-01-11 15:17:09

回答

3

PushAttrib/PopAttrib你需要用代码手动跟踪这些国家自行更换,或者你可以以这样的方式重新编写代码,任何依赖于这些国家,将它们设置本身。

glutGet(GLUT_ELAPSED_TIME)可以通过mach_absolute_time更换(特别不容易,但正确的事使用)或[的NSDate timeIntervalSinceReferenceDate](容易的,但可能有问题的,因为它不保证被单调增加,或在1.0至增加每秒)

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

2

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

2

我发现这个documentation online在问候了OpenGL ES 1.0规范

有为什么需要由AP- plication.The应用进行查询一种或另一种内部状态的可能需要动态几个原因发现实现限制(像素分量大小,纹理维度等),或者应用程序可能是分层库的一部分,并且可能需要保存和恢复其作为其渲染一部分的任何状态。 PushAttrib和PopAttrib可用于执行此操作,但它们实现和使用起来非常昂贵,因此不支持。一般而言,状态查询是不鼓励的,因为它们往往不利于性能。而不是尝试分割不同类型的动态状态可以被查询,例如矩阵堆栈的顶部,不支持动态状态查询,并且应用程序必须隐藏状态变化而不是查询管道。这使分层库变得困难,但是没有足够的理由来保留动态状态查询或属性推送和弹出。

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

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

试试这个hereeglSwapBuffers也许this book out

对不起,我没有给你一个更具体的答案。

1

通过这种缺乏推动attribs看似简单的功能很恼火,但你之前设置的参数,可以使用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);