NSOpenGLView с OpenGL 3.2 Core - PullRequest
       48

NSOpenGLView с OpenGL 3.2 Core

3 голосов
/ 19 сентября 2011

Заранее извиняюсь, если этот вопрос будет тривиальным или бессмысленным ... это одно из первых приложений, которое я разрабатываю.(К сожалению) Я не разработчик.

У меня есть NSWindow, которое содержит пользовательский вид, который является подклассом NSOpenGLView.

, поскольку NSWindow и NSOpenGLViewсоздаются через Interface Builder, мне не нужно init, ни NSOpenGLContext, ни NSOpenGLPixelFormat.

Я недавно перешел на OS X Lion и теперь хочу использовать новый OpenGL 3.2.

Из документации Apple я узнал, что для включения OpenGL 3.2 мне просто нужно написать что-то вроде:

NSOpenGLPixelFormatAttribute pixelFormatAttributes[] =
    {
        NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
        0
    };

    NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes] autorelease];
    NSOpenGLContext* openGLContext = [[[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil] autorelease];

перед инициализацией NSOpenGLContext.

Это довольно легко(даже для меня), но как я могу реализовать это в своем приложении, поскольку я никогда не init NSOpenGLContext?

Поскольку NSOpenGLView создается из Интерфейсного Разработчика, метод -initWithFormat:shareContext: неget call.

Поэтому я попытался переопределить метод -initWithCoder: следующим образом:

-(id)initWithCoder:(NSCoder *)aDecoder
{
 NSOpenGLPixelFormatAttribute pixelFormatAttributes[] =
    {
        NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
        0
    };

    NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes] autorelease];
    NSOpenGLContext* openGLContext = [[[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil] autorelease];
    [super initWithCoder:aDecoder];
    [self setOpenGLContext:openGLContext];
    [openGLContext makeCurrentContext];
}

, и OpenGL 3.2 правильно загружен, как сообщает glGetString(GL_VERSION), но созданный контекстбольше не взаимодействует с приложением ... ничего не отображается в представлении ..

Я перепробовал все, что знаю ... но я не могу решить эту проблему.

Как мне сделать вместо этого?

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

NSOpenGLView имеет метод setOpenGLContext. Таким образом, передайте контекст 3.2 представлению и затем вызовите setView для NSOpenGLContext.

Я не проверял это, но оно должно работать, хотя я только что создал свой OpenGL View.

1 голос
/ 09 октября 2011

Похоже, ваш код основан на OpenGL 2.1.OpenGL 3.2 в Lion поддерживает только основной профиль (без профиля совместимости), что означает, что все компоненты конвейера с фиксированными функциями (например, glBegin / End, glVertex, glPushMatrix, glMultMatrix) ушли.

Вы должны обновитьваш код очень понравилсяРабота будет меньше, если вы уже используете VBO.

0 голосов
/ 10 января 2012

Использование [setPixelFormat…] в моем подклассе awakeFromNib работает для меня, хотя мне это неудобно, потому что в документах ничего не обещает.

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

Надеюсь, ребята из IB добавят его туда, или, что еще лучше, класс NSOpenGLView вырастит механизм для подклассов до f

...