Ik heb (met hulp van Apple) een Cocoa/OpenGL applicatie gemaakt dat het hele scherm gebruik. Alleeen het probleem is dat ik nu niet meer mijn triangle in de functie drawTriangle() fullscreen zie, alleen een zwart scherm. Hier is de code:
#import "MyOpenGLView.h"#import <OpenGL/OpenGL.h>#include <OpenGL/gl.h>#include <OpenGL/glu.h>#include <OpenGL/glext.h>@implementation MyOpenGLViewstatic void drawTriangle (){ glColor3f(1.0f, 0.85f, 0.35f); glBegin(GL_TRIANGLES); { glVertex3f( 0.0, 0.6, 0.0); glVertex3f( -0.2, -0.3, 0.0); glVertex3f( 0.2, -0.3 ,0.0); } glEnd();}-(void) drawRect: (NSRect) bounds{ glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); drawTriangle(); glFlush(); CGDisplayErr err;NSOpenGLContext *fullScreenContext;NSOpenGLPixelFormatAttribute attrs[] = { // 1 NSOpenGLPFAFullScreen, NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), NSOpenGLPFAColorSize, 24, // 2 NSOpenGLPFADepthSize, 16, NSOpenGLPFADoubleBuffer, NSOpenGLPFAAccelerated, 0};NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL];[pixelFormat release];pixelFormat = nil;if (fullScreenContext == nil) { NSLog(@"Failed to create fullScreenContext"); return;}err = CGCaptureAllDisplays(); // 3if (err != CGDisplayNoErr) { [fullScreenContext release]; fullScreenContext = nil; return;}[fullScreenContext setFullScreen]; // 4[fullScreenContext makeCurrentContext]; // 5drawTriangle();}@end
@implementation MyOpenGLView
static void drawTriangle (){ glColor3f(1.0f, 0.85f, 0.35f); glBegin(GL_TRIANGLES); { glVertex3f( 0.0, 0.6, 0.0); glVertex3f( -0.2, -0.3, 0.0); glVertex3f( 0.2, -0.3 ,0.0); } glEnd();}
-(void) drawRect: (NSRect) bounds{ glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); drawTriangle(); glFlush(); CGDisplayErr err;NSOpenGLContext *fullScreenContext;NSOpenGLPixelFormatAttribute attrs[] = { // 1 NSOpenGLPFAFullScreen, NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), NSOpenGLPFAColorSize, 24, // 2 NSOpenGLPFADepthSize, 16, NSOpenGLPFADoubleBuffer, NSOpenGLPFAAccelerated, 0};NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL];[pixelFormat release];pixelFormat = nil;if (fullScreenContext == nil) { NSLog(@"Failed to create fullScreenContext"); return;}err = CGCaptureAllDisplays(); // 3if (err != CGDisplayNoErr) { [fullScreenContext release]; fullScreenContext = nil; return;}[fullScreenContext setFullScreen]; // 4[fullScreenContext makeCurrentContext]; // 5drawTriangle();}
@end
Misscien plaats ik de functie verkeerd?
Alvast bedankt
Daarna zet je (binnen de tekenroutine!) het scherm op fullScreen en teken je nog een keer. Ten eerste moet die fullScreen ergens in de initialisatie staan, anders doet-ie dat tijdens elke update en dat kost te veel tijd en het hoort ook gewoon niet. Ten tweede wordt je laatste drawTriangle niet gevolgd door een glFlush.
Wat je dus moet doen is de fullScreen code in een aparte methode plaatsen, die één keer aanroepen en dan zijn de eerste 5 regels van drawRect voldoende.
Ik heb mijn code geordend maar ik zie nog steeds niks. Kijk maar naar de code
#import "MyOpenGLView.h"#import <OpenGL/OpenGL.h>#include <OpenGL/gl.h>#include <OpenGL/glu.h>#include <OpenGL/glext.h>@implementation MyOpenGLViewstatic void Fullscreen (){CGDisplayErr err;NSOpenGLContext *fullScreenContext;NSOpenGLPixelFormatAttribute attrs[] = { // 1 NSOpenGLPFAFullScreen, NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), NSOpenGLPFAColorSize, 24, // 2 NSOpenGLPFADepthSize, 16, NSOpenGLPFADoubleBuffer, NSOpenGLPFAAccelerated, 0};NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL];[pixelFormat release];pixelFormat = nil;if (fullScreenContext == nil) { NSLog(@"Failed to create fullScreenContext"); return;}err = CGCaptureAllDisplays(); // 3if (err != CGDisplayNoErr) { [fullScreenContext release]; fullScreenContext = nil; return;}[fullScreenContext setFullScreen]; // 4[fullScreenContext makeCurrentContext]; // 5}static void drawTriangle (){ glColor3f(1.0f, 0.85f, 0.35f); glBegin(GL_TRIANGLES); { glVertex3f( 0.0, 0.6, 0.0); glVertex3f( -0.2, -0.3, 0.0); glVertex3f( 0.2, -0.3 ,0.0); } glEnd();}-(void) drawRect: (NSRect) bounds{ glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); Fullscreen(); drawTriangle();} @end
static void Fullscreen (){CGDisplayErr err;NSOpenGLContext *fullScreenContext;NSOpenGLPixelFormatAttribute attrs[] = { // 1 NSOpenGLPFAFullScreen, NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), NSOpenGLPFAColorSize, 24, // 2 NSOpenGLPFADepthSize, 16, NSOpenGLPFADoubleBuffer, NSOpenGLPFAAccelerated, 0};NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL];[pixelFormat release];pixelFormat = nil;if (fullScreenContext == nil) { NSLog(@"Failed to create fullScreenContext"); return;}err = CGCaptureAllDisplays(); // 3if (err != CGDisplayNoErr) { [fullScreenContext release]; fullScreenContext = nil; return;}[fullScreenContext setFullScreen]; // 4[fullScreenContext makeCurrentContext]; // 5}
-(void) drawRect: (NSRect) bounds{ glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); Fullscreen(); drawTriangle();
} @end
Weet je wat er fout is?
http://stijnschoor.googlepages.com/Fullscreen.zip