1

OSXアプリケーション用のOpenGLコンテキストを使用してCocoaウィンドウをプログラムで作成しようとしています。ウィンドウとOpenGLビューを作成するためにInterfaceBuilderを使用しない例をオンラインで見つけることができませんでした。

私が欲しいのはglClear、ウィンドウをマゼンタ(0xFF00FF)にすることだけです。ただし、ウィンドウは白のままです。

これが私のプロジェクトです:

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    NSOpenGLContext *openGLContext;
}

@property (assign) NSWindow *window;
@property (assign) NSOpenGLContext *openGLContext;

- (void)draw;

@end

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window;
@synthesize openGLContext;

static NSOpenGLPixelFormatAttribute glAttributes[] = {
    0
};

- (void)draw {
    NSLog(@"Drawing...");

    [self.openGLContext makeCurrentContext];

    glClearColor(1, 0, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.openGLContext flushBuffer];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSRect frame = NSMakeRect(0, 0, 200, 200);

    self.window = [[[NSWindow alloc]
        initWithContentRect:frame
        styleMask:NSBorderlessWindowMask
        backing:NSBackingStoreBuffered
        defer:NO] autorelease];
    [self.window makeKeyAndOrderFront:nil];

    NSOpenGLPixelFormat *pixelFormat
        = [[NSOpenGLPixelFormat alloc] initWithAttributes:glAttributes];
    self.openGLContext = [[NSOpenGLContext alloc]
        initWithFormat:pixelFormat shareContext:nil];
    [self.openGLContext setView:[self.window contentView]];

    [NSTimer
        scheduledTimerWithTimeInterval:.1
        target:self
        selector:@selector(draw)
        userInfo:nil
        repeats:YES];
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)_app {
    return YES;
}

@end

main.m

#import "AppDelegate.h"

#import <Cocoa/Cocoa.h>

int main(int argc, char **argv) {
    AppDelegate *appDelegate = [[AppDelegate alloc] init];
    return NSApplicationMain(argc, (const char **) argv);
}
4

2 に答える 2

2

のドキュメントは次のように-[NSOpenGLContext flushBuffer]述べています。

討論

受信者がダブルバッファコンテキストでない場合、この呼び出しは何もしません。

NSOpenGLPFADoubleBufferピクセル形式の属性に含めることで、コンテキストを二重にバッファリングすることができます。glFlush()または、代わりに呼び出し-[NSOpenGLContext flushBuffer]て、コンテキストを単一バッファのままにすることもできます。

于 2013-01-20T20:41:22.823 に答える
0

代わりに、このコードをピクセル形式の属性に使用してください。

NSOpenGLPixelFormatAttribute glAttributes[] =
{
    NSOpenGLPFAColorSize, 24,
    NSOpenGLPFAAlphaSize, 8,
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFAAccelerated,
    0
};

私はそれをテストしました、そしてあなたはあなたが探していたマゼンタのスクリーンを手に入れます。

于 2015-04-27T05:40:59.827 に答える