gpt4 book ai didi

objective-c - 不使用 Interface Builder 创建 OpenGL View

转载 作者:太空狗 更新时间:2023-10-30 03:59:38 26 4
gpt4 key购买 nike

所以我正在尝试创建一个 openGL View (在我的窗口中)。我正在制作一个 Cocoa 应用程序。我设法通过 Interface Builder 创建了一个,但出于教育目的,我想继续并在没有它的情况下创建一个。就在纸上。

这就是我告诉你我正在努力解决的问题。所以到目前为止我基本上做过的尝试是这样的:我创建了一个继承自 NSOpenGLView 的新类“MyOpenGLView.h/m”。我没有向它添加任何私有(private)变量或方法,只是类名。我唯一做的就是重写 initWithFrame:(在里面添加一个 self = [super initWithFrame:pixelFormat:]。)我在网上读到过,你必须先用这样的东西实例化它,然后才能使用它)。这是代码:

- (id) initWithFrame:(NSRect)frameRect
{
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc]
initWithAttributes:(NSOpenGLPixelFormatAttribute[])
{
NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 32,
nil
}];
self = [super initWithFrame:frameRect pixelFormat:pixelFormat];
[[self openGLContext] makeCurrentContext];
}

所以我有另一个名为“MyViewController.h/m”的类来处理我的 View ?那里有我的 MyOpenGLView *myView。在 .m 文件中,我使用类似这样的内容:

myView = [[MyOpenGLView alloc] initWithFrame:CGRectMake(0,0,100.0,100.0)];
if (!myView) { NSLog(@"ERROR"); }

当然,我会出错。

我的窗口应用程序中没有移植 openGL View 。我猜它与被调用方法的层次结构有关,但话又说回来..我不确定。你能帮我吗?

最佳答案

他们让这个工作的方式是我没有在我看来实现 init 方法。然后在我的 Controller 或应用程序委托(delegate)中。

@implementation AppDelegate

@synthesize window = _window;
@synthesize view = _view;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSRect mainDisplayRect = [[NSScreen mainScreen] frame]; // I'm going to make a full screen view.

NSOpenGLPixelFormatAttribute attr[] = {
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, // Needed if using opengl 3.2 you can comment this line out to use the old version.
NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFAAccelerated,
NSOpenGLPFADoubleBuffer,
0
};

NSOpenGLPixelFormat *pix = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
self.view = [[OpenGLViewCoreProfile alloc] initWithFrame:mainDisplayRect pixelFormat:pix];

// Below shows how to make the view fullscreen. But you could just add to the contact view of any window.
self.window = [[NSWindow alloc] initWithContentRect:mainDisplayRect
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:YES];

self.window.opaque = YES;
self.window.hidesOnDeactivate = YES;
self.window.level = NSMainMenuWindowLevel + 1; // Show window above main menu.
self.window.contentView = self.view;
[self.window makeKeyAndOrderFront:self]; // Display window.
}

@end

可以在-prepareOpenGl 方法中调用-makeCurrentContext。我在下面写的所有内容都不是必需的,但出于性能原因很好。我已经开始使用 CVDisplayLink 将帧绘制与屏幕刷新率同步,所以我的 openGLview 看起来像

// This is the callback function for the display link.
static CVReturn OpenGLViewCoreProfileCallBack(CVDisplayLinkRef displayLink,
const CVTimeStamp* now,
const CVTimeStamp* outputTime,
CVOptionFlags flagsIn,
CVOptionFlags *flagsOut,
void *displayLinkContext) {
@autoreleasepool {
OpenGLViewCoreProfile *view = (__bridge OpenGLViewCoreProfile*)displayLinkContext;
[view.openGLContext makeCurrentContext];
CGLLockContext(view.openGLContext.CGLContextObj); // This is needed because this isn't running on the main thread.
[view drawRect:view.bounds]; // Draw the scene. This doesn't need to be in the drawRect method.
CGLUnlockContext(view.openGLContext.CGLContextObj);
CGLFlushDrawable(view.openGLContext.CGLContextObj); // This does glFlush() for you.

return kCVReturnSuccess;
}
}

- (void)reshape {
[super reshape];
CGLLockContext(self.openGLContext.CGLContextObj);

... // standard opengl reshape stuff goes here.

CGLUnlockContext(self.openGLContext.CGLContextObj);
}

- (void)prepareOpenGL {
[super prepareOpenGL];

[self.openGLContext makeCurrentContext];
GLint swapInt = 1;
[self.openGLContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];

CGLLockContext(self.openGLContext.CGLContextObj);

... // all opengl prep goes here

CGLUnlockContext(self.openGLContext.CGLContextObj);

// Below creates the display link and tell it what function to call when it needs to draw a frame.
CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
CVDisplayLinkSetOutputCallback(self.displayLink, &OpenGLViewCoreProfileCallBack, (__bridge void *)self);
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(self.displayLink,
self.openGLContext.CGLContextObj,
self.pixelFormat.CGLPixelFormatObj);
CVDisplayLinkStart(self.displayLink);
}

关于objective-c - 不使用 Interface Builder 创建 OpenGL View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8559493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com