Простой пример OpenGL с Какао - PullRequest
2 голосов
/ 28 марта 2012

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

Ответы [ 3 ]

6 голосов
/ 28 марта 2012

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

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;
}
3 голосов
/ 01 августа 2012

С этой проблемой я часто сталкиваюсь, и меня удивляет, что этот важный шаг не является частью учебной документации по 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.

0 голосов
/ 28 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...