无法为NSOpenGLContext

时间:2016-01-02 04:32:09

标签: objective-c cocoa opengl openglcontext

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

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

我的 main.m 文件:

NSApplicationMain

然后我有了我的委托类,我将避免发布文件 Delegate.h ,因为在 Delegate.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;
}

窗口打开就好了。我可以告诉我#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正在被调用。然而,窗口显示为空。

printf调用显示-draw的view属性等于地址0x0。我没有看到关于为什么我无法设置self.glContext的可绘制对象的文档或其他论坛帖子。

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

1 个答案:

答案 0 :(得分:2)

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

基本上,如果视图的窗口还没有&#34;设备&#34;,NO可能会失败。当我遇到这种情况时,它通常会向控制台记录一条关于&#34;无效抽奖的信息,但我还没有检查最近版本的操作系统。

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