(对于这里看似大量的代码,请先提前感到抱歉)我正在尝试使用Cocoa创建带有OpenGL上下文的窗口,但是我发现我无法设置我创建的NSOpenGLContext的view属性。

我不能简单地使用NSOpenGLView,因为我需要与C ++图形后端交互并使用多个上下文。我在这里发布的代码只是我试图掌握处理NSOpenGLContext的方法,但是它将在更大的项目中使用。这就是为什么我手动而不是通过NIB / NSApplication实例化NSWindowNSApplicationMain的原因。

我的main.m文件:

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "Delegate.h"

int main(int argc, const char * argv[]) {

    [NSApplication sharedApplication];
    Delegate* dlg = [[Delegate alloc] init];

    [NSApp setDelegate:dlg];

    [NSApp run];

    return 0;
}


然后,我有了我的委托类,并且我将避免发布文件Delegate.h,因为对于Delegate.m的这些内容,它显然是什么:

#import <Cocoa/Cocoa.h>
#import "Delegate.h"
#import <OpenGL/gl.h>

@implementation Delegate

- (void) draw
{
    [self.glContext makeCurrentContext];

    glClearColor(1, 0, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.glContext flushBuffer];
}


- (void) applicationDidFinishLaunching:(NSNotification *)notification
{
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];

    self.win = [[NSWindow alloc] initWithContentRect:NSMakeRect(30, 30, 300, 200)
                                           styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask
                                             backing:NSBackingStoreBuffered
                                               defer:YES];



    NSOpenGLPixelFormatAttribute glAttributes[] =
    {
        NSOpenGLPFAColorSize, 24,
        NSOpenGLPFAAlphaSize, 8,
        NSOpenGLPFADoubleBuffer,
        NSOpenGLPFAAccelerated,
        0
    };

    self.glContext = [[NSOpenGLContext alloc] initWithFormat:[[NSOpenGLPixelFormat alloc] initWithAttributes:glAttributes]
                                                shareContext:nil];
    [self.glContext setView: [self.win contentView]];
    printf("view:%p, contentView:%p\n", [self.glContext view], [self.win contentView]);


    [self.win makeKeyAndOrderFront:nil];

    [NSTimer
     scheduledTimerWithTimeInterval:.1
     target:self
     selector:@selector(draw)
     userInfo:nil
     repeats:YES];
}


窗口随即打开。我可以说-applicationDidFinishLaunching-draw被调用。窗口显示为空。

printf调用显示self.glContext的view属性等于地址0x0。我看不到有关为什么我无法设置NSOpenGLContext的drawable对象的文档或其他论坛主题。

我尝试将NSOpenGLContext放入其自己的NSView子类中,并将该子类添加为窗口内容视图的子视图,但是没有成功。

最佳答案

尝试将defer-[NSWindow initWithContentRect:...]参数设置为NO。您可能还希望在订购屏幕上的窗口之后设置GL上下文的视图。

基本上,如果视图的窗口还没有“设备”,则-[NSOpenGLContext setView:]可能会失败。当我遇到这种情况时,通常会在控制台上记录一条有关“无效的可绘制对象”的消息,但是我还没有签入最新版本的OS。

另外,您需要从视图中注册为NSViewGlobalFrameDidChangeNotification通知的观察者,并作为响应在GL上下文对象上调用-update

08-16 16:03