PDA

View Full Version : Mac OpenGL 3.2 white screen



TheVyax
07-13-2012, 01:06 PM
Hi Forum,

i try to set the Pixel Format for my NSOpenGLView.
But I only get a white screen.


#import <Cocoa/Cocoa.h>

#import <OpenGL/gl.h>
#import <OpenGL/OpenGL.h>
#import <QuartzCore/CVDisplayLink.h>

@interface OpenGLView : NSOpenGLView
{
CVDisplayLinkRef dlDisplayLink;
}


#import "OpenGLView.h"

@interface OpenGLView()

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime;

@end


@implementation OpenGLView

- (void) awakeFromNib
{
NSOpenGLPixelFormatAttribute pfaAttributes[] = {NSOpenGLPFADoubleBuffer, NSOpenGLPFADepthSize, 24, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, 0};

@autoreleasepool
{
NSOpenGLPixelFormat *pfPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pfaAttributes];

NSOpenGLContext* glcContext = [[NSOpenGLContext alloc] initWithFormat:pfPixelFormat shareContext:nil];

[self setPixelFormat:pfPixelFormat];

[self setOpenGLContext:glcContext];
}
}

- (void)prepareOpenGL
{
[super prepareOpenGL];

[[self openGLContext] makeCurrentContext];

GLint iSwap = 1;

[[self openGLContext] setValues:&iSwap forParameter:NSOpenGLCPSwapInterval];

glClearColor(0.0, 0.0, 1.0, 1.0); // Bild blau
glViewport(0, 0, (GLsizei) self.bounds.size.width, (GLsizei) self.bounds.size.height);

[[self openGLContext] setValues:&iSwap forParameter:NSOpenGLCPSwapInterval];

CVDisplayLinkCreateWithActiveCGDisplays(&dlDisplayLink);

CVDisplayLinkSetOutputCallback(dlDisplayLink, &DisplayLinkCallback, (__bridge void *) self);

CGLContextObj cglContext = [[self openGLContext] CGLContextObj];

CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj];

CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext( dlDisplayLink, cglContext, cglPixelFormat);

CVDisplayLinkStart(dlDisplayLink);
}

- (void)reshape
{
[super reshape];

CGLLockContext([[self openGLContext] CGLContextObj]);

glViewport(0, 0, (GLsizei) self.bounds.size.width, (GLsizei) self.bounds.size.height);

CGLUnlockContext([[self openGLContext] CGLContextObj]);
}

- (void)renderScene
{
[[self openGLContext] makeCurrentContext];

CGLLockContext((CGLContextObj)[[self openGLContext] CGLContextObj]);

// Render - Start

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glFlush();

// Render - Ende

CGLUnlockContext((CGLContextObj)[[self openGLContext] CGLContextObj]);
}

static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void *displayLinkContext)
{
return [(__bridge OpenGLView *)displayLinkContext getFrameForTime:outputTime];
}

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime
{
@autoreleasepool
{
[self renderScene];
}

return kCVReturnSuccess;
}

@end

The screen should be blue. glCloarColor(0.0, 0.0, 1.0, 1.0)

Dan Bartlett
07-13-2012, 02:38 PM
You appear to be using double buffering, but you seem to never swap buffers.

I'm using Windows + have no objective c experience, but searching the internet I found this link: https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGL_OpenGL/Reference/reference.html#//apple_ref/c/func/CGLFlushDrawable , so looking at your code, perhaps instead of glFlush() you need to use something like:

CGLFlushDrawable([[self openGLContext] CGLContextObj]);

TheVyax
07-15-2012, 02:58 AM
Thank you very much!!!