OpenGL Fullscreen probleem
3 april 2008 - 15:38   
geplaatst door: stijnschoor
Hallo

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 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(); // 3
if (err != CGDisplayNoErr) {
       [fullScreenContext release];
       fullScreenContext = nil;
       return;
}
[fullScreenContext setFullScreen]; // 4
[fullScreenContext makeCurrentContext]; // 5
drawTriangle();
}

@end

Misscien plaats ik de functie verkeerd?

Alvast bedankt

"What's in a name that we call a mac"
Shakespeare
OpenGL Fullscreen probleem
5 april 2008 - 18:02    reactie #1
geplaatst door: stijnschoor
Iemand al enig idee?
"What's in a name that we call a mac"
Shakespeare
OpenGL Fullscreen probleem
5 april 2008 - 19:40    reactie #2
geplaatst door: stijnschoor
Laat maar, ik ben nu even niet met OpenGL bezig. Misschien kan ik het op een ander forum proberen.
"What's in a name that we call a mac"
Shakespeare
OpenGL Fullscreen probleem
6 april 2008 - 08:40    reactie #3
geplaatst door: TGV
Je code is nogal rommelig. Je drawRect begint met het tekenen van een driekhoek (de eerste 5 regels). Die code is goed.

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.

OpenGL Fullscreen probleem
6 april 2008 - 11:01    reactie #4
geplaatst door: stijnschoor
Allereerst bedankt voor je antwoord, het geeft me hoop dat er mensen zijn die dit weten.

Ik heb mijn code geordend maar ik zie nog steeds niks. :music:
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 MyOpenGLView


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(); // 3
if (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

Weet je wat er fout is?  

"What's in a name that we call a mac"
Shakespeare
OpenGL Fullscreen probleem
6 april 2008 - 12:58    reactie #5
geplaatst door: TGV
Ik zou de Fullscreen aanroep niet vanuit de body van drawRect doen (het moet een aparte methode zijn die vanuit de omgeving één keer wordt aangeroepen), maar hoe dan ook: een glFlush() op het einde van drawRect kan wonderen doen...
OpenGL Fullscreen probleem
6 april 2008 - 14:20    reactie #6
geplaatst door: stijnschoor
Lukt nog steeds niet. Hier het project. Hopelijk kan je er wat mee.

http://stijnschoor.googlepages.com/Fullscreen.zip

"What's in a name that we call a mac"
Shakespeare