无法为 NSOpenGLContext 设置视图
Cannot set view for NSOpenGLContext
(对于这里看似大量的代码提前抱歉)我正在尝试使用 Cocoa 创建一个带有 OpenGL 上下文的 window,但我发现我无法设置我创建的 NSOpenGLContext
的视图 属性。
我不能简单地使用 NSOpenGLView
,因为我需要与 C++ 绘图后端接口并使用多个上下文。我 post 此处的代码只是我试图掌握处理 NSOpenGLContext
的代码,但它将用于更大的项目。这就是为什么我要手动实例化 NSApplication
和我的 NSWindow
而不是通过 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;
}
然后我有我的代表 class,我将避免 post 编辑文件 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];
}
window打开就好了。我能够告诉 -applicationDidFinishLaunching
和 -draw
正在被调用。然而 window 显示为空。
printf 调用显示 self.glContext
的视图 属性 等于地址 0x0。我没有看到关于为什么我无法设置 NSOpenGLContext
.
的可绘制对象的文档或其他论坛主题
我尝试将 NSOpenGLContext
放入 NSView
的子 class 中,并将该子class 添加为 window 的子视图' s 内容视图,但没有成功。
尝试将 -[NSWindow initWithContentRect:...]
的 defer
参数设置为 NO
。您可能还希望在订购 window on-screen.
后设置 GL 上下文的视图
基本上,如果视图的 window 还没有 "device",-[NSOpenGLContext setView:]
可能会失败。当我遇到这种情况时,它通常会向控制台记录一条关于 "invalid drawable" 的消息,但我没有检查 OS.
的最新版本
此外,您需要注册为来自视图的 NSViewGlobalFrameDidChangeNotification
通知的观察者,并作为响应,在 GL 上下文对象上调用 -update
。
(对于这里看似大量的代码提前抱歉)我正在尝试使用 Cocoa 创建一个带有 OpenGL 上下文的 window,但我发现我无法设置我创建的 NSOpenGLContext
的视图 属性。
我不能简单地使用 NSOpenGLView
,因为我需要与 C++ 绘图后端接口并使用多个上下文。我 post 此处的代码只是我试图掌握处理 NSOpenGLContext
的代码,但它将用于更大的项目。这就是为什么我要手动实例化 NSApplication
和我的 NSWindow
而不是通过 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;
}
然后我有我的代表 class,我将避免 post 编辑文件 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];
}
window打开就好了。我能够告诉 -applicationDidFinishLaunching
和 -draw
正在被调用。然而 window 显示为空。
printf 调用显示 self.glContext
的视图 属性 等于地址 0x0。我没有看到关于为什么我无法设置 NSOpenGLContext
.
我尝试将 NSOpenGLContext
放入 NSView
的子 class 中,并将该子class 添加为 window 的子视图' s 内容视图,但没有成功。
尝试将 -[NSWindow initWithContentRect:...]
的 defer
参数设置为 NO
。您可能还希望在订购 window on-screen.
基本上,如果视图的 window 还没有 "device",-[NSOpenGLContext setView:]
可能会失败。当我遇到这种情况时,它通常会向控制台记录一条关于 "invalid drawable" 的消息,但我没有检查 OS.
此外,您需要注册为来自视图的 NSViewGlobalFrameDidChangeNotification
通知的观察者,并作为响应,在 GL 上下文对象上调用 -update
。