2012-03-27 4 views
2

Я пытался сделать сцену с OpenGL в Objective-C целыми неделями, и я просто не могу заставить ее работать. Я начал с Drawing to an NSOpenGLView Class: A Tutorial, и это сработало хорошо для меня, и я даже смог немного расширить его, но руководство по программированию OpenGL оставляет после этого шага какое-то отверстие. Они объясняют детали того, как удваивать буфер и синхронизировать частоту обновления, и все это, но они не содержат никаких реальных примеров того, как обновлять представление. Поэтому в настоящее время я могу нарисовать на экране много классных вещей, но как только он там, это просто статическое изображение. Нет движения, нет вращения.
Кто-нибудь знает о хорошем, простой пример того, как это делается?Простой пример OpenGL с Cocoa

ответ

3

Это проблема, я часто сталкиваюсь, и это меня удивляет, что этот важный шаг не является частью NSOpenGLView учебную документацию.

Вы должны установить таймер обратного вызова для уведомления мнения о том, что нужно перерисовывать:

- (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]; 
} 

Обратите внимание, что это происходит в awakeFromNib. Таймер срабатывает с интервалом 1/30, который вы можете изменить, если хотите. Каждый раз, когда он срабатывает, он вызывает функцию с именем idle. Эта функция может быть реализована следующим образом:

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

Это приводит мнение перекроить себя все обновления, включая вашу OpenGL графику.

+2

Обратите внимание, что это не очень хороший вариант для высокопроизводительного рисования; вы должны действительно использовать ссылку для отображения, чтобы убедиться, что вы рисуете в соответствующие моменты времени для своего дисплея. – andyvn22

0

Это очень общий вопрос и как, наконец, создать всю структуру механизма рендеринга, зависит от вас. Было бы очень много, чтобы рассказать вам, как реализовать это, но есть множество книг и учебников онлайн, чтобы получить startet.

Очень приятно серьезно относиться к тому, как медленно создать простую структуру, подходящую для игр (в данном случае 2D), можно найти here, но это для Win32, поэтому вам нужно будет адаптировать это, но при условии, что у вас есть общее понимание программирования, вы должны понимать общий дизайн, который он создает.

6

Вы можете попробовать использовать ссылку на изображение для повторного рисования, синхронизированного с дисплеем. Установите один вверх:

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

Затем, ваш обратный вызов выполняется один раз за кадр:

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

Что это за объект IRGL, который вы используете? Документация Apple, похоже, не знает, что это такое. – anthropomorphic

+0

Это объект, который вы используете, который содержит ваш контекст? Я получил, что '[IRGL gl]' возвращает NSOpenGLContext (или его подкласс), должен ли я просто игнорировать эту часть? – anthropomorphic

+0

Упс! Это мой собственный класс, который я случайно оставил. Просто получите свой контекст, как бы вы ни хотели. Если вы уже рисуете, у вас должен быть один. – andyvn22

Смежные вопросы