(对于这里看似大量的代码,请先提前感到抱歉)我正在尝试使用Cocoa创建带有OpenGL上下文的窗口,但是我发现我无法设置我创建的NSOpenGLContext
的view属性。
我不能简单地使用NSOpenGLView
,因为我需要与C ++图形后端交互并使用多个上下文。我在这里发布的代码只是我试图掌握处理NSOpenGLContext
的方法,但是它将在更大的项目中使用。这就是为什么我手动而不是通过NIB / NSApplication
实例化NSWindow
和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
的view属性等于地址0x0。我看不到有关为什么我无法设置NSOpenGLContext
的drawable对象的文档或其他论坛主题。我尝试将
NSOpenGLContext
放入其自己的NSView
子类中,并将该子类添加为窗口内容视图的子视图,但是没有成功。 最佳答案
尝试将defer
的-[NSWindow initWithContentRect:...]
参数设置为NO
。您可能还希望在订购屏幕上的窗口之后设置GL上下文的视图。
基本上,如果视图的窗口还没有“设备”,则-[NSOpenGLContext setView:]
可能会失败。当我遇到这种情况时,通常会在控制台上记录一条有关“无效的可绘制对象”的消息,但是我还没有签入最新版本的OS。
另外,您需要从视图中注册为NSViewGlobalFrameDidChangeNotification
通知的观察者,并作为响应在GL上下文对象上调用-update
。