interface-builder – 使用OpenGL 3.2 Core的NSOpenGLView

如果这个问题很简单或者说是废话,我会提前道歉……这是我正在开发的第一个应用程序之一. (Unfortunatley)我不是开发人员.

我有一个NSWindow,它包含一个自定义View,它是NSOpenGLView的子类.

由于NSWindow和NSOpenGLView是通过Interface Builder创建的,因此我不需要初始化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之前.

这很容易(即使对我来说),但是我怎么能在我的应用程序中实现它,因为我从不初始化NSOpenGLContext?

由于NSOpenGLView是从Interface Builder创建的,因此不会调用-initWithFormat:shareContext:方法.

因此我试图用这样的东西覆盖-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];
}

并且正如glGetString(GL_VERSION)所报告的那样正确加载OpenGL 3.2,但创建的Context不再与应用程序进行交互……在视图中没有绘制任何内容.

我尝试了所有我知道的……但我无法解决这个问题.

我该怎么做?

最佳答案
听起来你的代码是基于OpenGL 2.1的. Lion中的OpenGL 3.2仅支持核心配置文件(没有兼容性配置文件),这意味着所有固定功能管道内容(例如glBegin / End,glVertex,glPushMatrix,glMultMatrix)都已消失.

你必须非常更新你的代码.如果你已经使用VBO,工作将会减少.

转载注明原文:interface-builder – 使用OpenGL 3.2 Core的NSOpenGLView - 代码日志