2012-03-27 12 views
2

Ich habe versucht, eine Szene mit OpenGL in Objective-C für Wochen zu machen, und ich kann es einfach nicht funktionieren. Ich begann mit Drawing to an NSOpenGLView Class: A Tutorial, und das funktionierte gut für mich, und ich war sogar in der Lage, es ein wenig zu erweitern, aber der OpenGL Programming Guide hinterlässt eine Art Loch nach diesem Schritt. Sie erklären die Details zur doppelten Pufferung und Synchronisierung der Aktualisierungsraten und all das, aber sie enthalten keine konkreten Beispiele für die Aktualisierung Ihrer Ansicht. So kann ich derzeit viele coole Sachen auf den Bildschirm ziehen, aber sobald es da ist, ist es nur ein statisches Bild. Keine Bewegung, keine Drehung.
Kennt jemand eine gute, einfache Beispiel dafür, wie das eigentlich gemacht wird?Einfache OpenGL-Beispiel mit Cocoa

Antwort

3

Dies ist ein Problem, das ich häufig auftreten, und es überrascht mich, dass dieser entscheidende Schritt nicht Teil der NSOpenGLView ist Tutorial-Dokumentation.

Sie benötigen einen Rückruf-Timer einzurichten, um die Ansicht zu benachrichtigen, dass es neu gezeichnet werden muss:

- (void)awakeFromNib 
{ 
    NSTimer *updateTimer = [NSTimer timerWithTimeInterval:1.0f/30.0f target:self selector:@selector(idle:) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSDefaultRunLoopMode]; 
} 

Beachten Sie, dass dies in awakeFromNib passiert. Der Timer wird in einem Intervall von 1/30 ausgelöst, das Sie ändern können, wenn Sie möchten. Jedes Mal, wenn es ausgelöst wird, ruft es eine Funktion namens idle auf. Diese Funktion kann wie so implementiert werden:

- (void)idle:(NSTimer*)timer 
{ 
    [self setNeedsDisplay:YES]; 
} 

Dies bewirkt, dass die Ansicht, selbst jedes Update neu zu zeichnen, einschließlich Ihrer OpenGL-Grafik.

+2

Beachten Sie, dass dies keine gute Option für Hochleistungszeichnen ist; Sie sollten wirklich eine Anzeigeverbindung verwenden, um sicherzustellen, dass Sie zu den geeigneten Zeiten für Ihre Anzeige zeichnen. – andyvn22

0

Das ist eine sehr allgemeine Frage und wie Sie schließlich die gesamte Struktur einer Rendering-Engine entwerfen können, bleibt Ihnen überlassen. Es wäre eine Menge, um Ihnen zu sagen, wie Sie das implementieren, aber es gibt viele Bücher und Tutorials online zu starten.

Ein ziemlich nettes ernstes auf, wie man langsam eine einfache Struktur passend für Spiele (in diesem Fall 2D) bildet, kann here gefunden werden, aber es ist für Win32, also würden Sie das anpassen müssen, aber vorausgesetzt, Sie haben ein allgemeines Verständnis von der Programmierung sollten Sie in der Lage sein, das allgemeine Design, das er entwickelt, zu verstehen.

6

Sie könnten versuchen, eine Anzeigeverbindung für wiederholtes Zeichnen zu verwenden, das mit dem Display synchronisiert wird. Stellen Sie einen bis:

GLint swapInt = 1; 
[yourContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; 

CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); 
CVDisplayLinkSetOutputCallback(displayLink, &displayLinkCallback, self); 

CGLContextObj cglContext = [yourContext CGLContextObj]; 
CGLPixelFormatObj cglPixelFormat = [[NSOpenGLView defaultPixelFormat] CGLPixelFormatObj]; 
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat); 

CVDisplayLinkStart(displayLink); 

Dann Ihr Rückruf wird einmal pro Rahmen:

static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) 
{ 
    NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
    if ([self lockFocusIfCanDraw]) 
    { 
     //Your drawing code 
     [self unlockFocus]; 
    } 
    [pool drain]; 

    return kCVReturnSuccess; 
} 
+0

Was ist das IRGL-Objekt, das Sie verwenden? Apples Dokumentation scheint nicht zu wissen, was das ist. – anthropomorphic

+0

Ist es ein Objekt, das Sie verwenden, das Ihren Kontext enthält? Ich habe verstanden, dass '[IRGL gl]' einen NSOpenGLContext (oder eine Unterklasse davon) zurückgibt, sollte ich diesen Teil einfach ignorieren? – anthropomorphic

+0

Hoppla! Das ist meine eigene Klasse, die ich versehentlich verlassen habe. Nimm dir einfach deinen Kontext, wie du willst. Wenn Sie bereits zeichnen, müssen Sie eines haben. – andyvn22