2011-01-11 16 views
3

Ich suche nach einer Möglichkeit, meine PC OpenGL-Anwendung und eine iPhone App in ein XCode-Projekt (für die Bequemlichkeit) zu migrieren. Also, wenn ich diese Quelldateien nutzen möchte, möchte ich dies für beide Plattformen anwenden und möchte für beide Plattformen von einem Projekt kompilieren können. Wie könnte ich das erreichen? Gibt es eine Möglichkeit, dies in XCode 4 oder 3.25 zu tun? Jede Hilfe würde sehr geschätzt werdenErsetzen Sie diese OpenGL-Funktionen durch OpenGL ES?

bearbeiten: Okay, ich ging so weit - Alles in allem scheint es mit XCode 4 zu arbeiten. Meine einzigen Probleme sind diese openGL/Glut Funktionen, die nicht auf dem iPhone funktionieren:

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

Irgendwelche Ideen, wie Sie diese Probleme beheben können?

+0

sind nicht spezifisch für ein OpenGL-Anwendung fragt diese Frage etwas Ähnliches: [Gleicher Code-Basis für iPhone/Desktop-App] (http://stackoverflow.com/questions/4617166/same-code-base-for-iphone-desktop-app) –

+1

Sie würden viel besser dran sein, die Engine in GL ES zu schreiben und dann mit OpenGL-Äquivalenten für den PC zu kommen ... – Goz

+0

Ohne die NDA zu verletzen, wurden die neuen Funktionen in Xcode 4 benötigt, um ein Projekt für beide Plattformen zu erstellen? –

Antwort

3

PushAttrib/PopAttrib müssen Sie sich mit Code ersetzen, der diese Zustände manuell verfolgt, oder Sie könnten Ihren Code so umschreiben, dass alles, was auf diesen Zuständen beruht, sie selbst setzt.

glutGet (GLUT_ELAPSED_TIME) könnte durch mach_absolute_time ersetzt werden (nicht besonders einfach, aber das richtige zu verwenden) oder [NSDate timeIntervalSinceReferenceDate] (einfach, aber möglicherweise problematisch, da es nicht garantiert monoton ansteigend oder um 1.0 zu erhöhen ist pro Sekunde)

glutSwapBuffers wird ersetzt durch -presentRenderbuffer: auf Ihrem EAGLContext (aber es klingt, als ob Sie das schon tun; wenn Sie nicht wären, würden Sie nichts sehen).

2

Sie können dgles verwenden, um Ihre Desktop-OpenGL-Implementierung zu umbrechen und eine OpenGL ES 1.x-Schnittstelle bereitzustellen.

2

fand ich diese documentation online in Bezug auf die OpenGL ES 1.0-Spezifikation

Es gibt mehrere Gründe, warum eine oder andere Art von internem Zustand muss durch eine AP- plication.The Anwendung abgefragt wird dynamisch muß möglicherweise entdecken Sie Implementierungslimits (Pixel-Komponentengrößen, Texturdimensionen usw.), oder die Anwendung ist möglicherweise Teil einer mehrschichtigen Bibliothek und muss möglicherweise jeden Zustand speichern und wiederherstellen, den sie als Teil ihres Renderings stört. PushAttrib andPopAttrib kann verwendet werden, um dies durchzuführen, aber sie sind teuer zu implementieren und zu verwenden und daher nicht unterstützt.General gesprochen State-Abfragen werden abgeraten, da sie oft für die Leistung schädlich sind.Versuchen Sie, verschiedene Arten von dynamischen Zustand zu partitionieren B. Dynamic State Queries unterstützt werden, und Anwendungen müssen Zustandsänderungen überschatten, anstatt die Pipeline abzufragen. Dies macht es schwierig für Schichtbibliotheken, aber es gab nicht genug Berechtigung, dynamische Zustandsabfragen zu behalten oder Attribut schieben und knallen.

Das und dieses other link here scheint anzuzeigen, dass Sie diese Bits selbst verfolgen müssen. Keine Hilfe für dich da.

Schwemme ruft nur den Systemcode, ja? (WglSwapBuffers, glxSwapBuffers)

Versuchen Sie, diese hereeglSwapBuffers und vielleicht this book out

Leider habe ich nicht eine konkrete Antwort für Sie.

1

sehr verärgert durch diesen Mangel scheinbar einfache Funktionalität attribs drängen, aber Sie können verwenden glGetto den Zustand etwas zu bekommen, bevor Sie den param gesetzt, wie diese, die für mich gearbeitet:

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