2

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

我不能简单地使用NSOpenGLView,因为我需要与 C++ 绘图后端接口并使用多个上下文。我在这里发布的代码只是我试图掌握处理NSOpenGLContexts,但它将用于更大的项目。这就是为什么我要手动实例化NSApplicationNSWindow不是通过 NIB/实例化的原因NSApplicationMain

我的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等于地址 0x0。我没有看到任何文档或其他论坛帖子说明为什么我无法设置NSOpenGLContext.

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

4

1 回答 1

2

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

基本上,-[NSOpenGLContext setView:]如果视图的窗口还没有“设备”,则可能会失败。当这种情况发生在我身上时,它通常会向控制台记录一条关于“无效可绘制”的消息,但我没有检查最新版本的操作系统。

此外,您需要注册为NSViewGlobalFrameDidChangeNotification来自视图的通知的观察者,并作为响应调用-updateGL 上下文对象。

于 2016-01-02T05:25:21.013 回答