2010-11-07 5 views
2

J'essaye de créer une application OpenGL en utilisant Cocoa API, et maintenant tout fonctionne correctement, sauf pour une chose. Lorsque la fenêtre principale est redimensionnée, le contexte GL ne semble pas correctement mis à jour.Erreur lors de la création de NSOpenGLView

Voici le code utilisé pour configurer le contexte de fenêtre et de rendu.

fenêtre principale:

m_window = [[NSWindow alloc] initWithContentRect:window_rect styleMask:(NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask | NSResizableWindowMask) backing:NSBackingStoreBuffered defer:YES];

window_title = [NSString stringWithCString:m_window_title->c_str() 
            encoding:NSUTF8StringEncoding]; 

window_color = [NSColor colorWithCalibratedRed:m_window_color->getRed() 
             green:m_window_color->getGreen() 
              blue:m_window_color->getBlue() 
             alpha:m_window_color->getAlpha()]; 

if (m_centered) 
{ 
    [m_window center]; 
} 

[m_window setTitle:window_title]; 
[m_window setBackgroundColor:window_color]; 
[m_window setOneShot:YES]; 
[m_window setOpaque:YES]; 
[m_window setDelegate:window_delegate]; 
[m_window setAcceptsMouseMovedEvents:YES]; 

vue OpenGL:

NSOpenGLPixelFormatAttribute attrs[] = {NSOpenGLPFADoubleBuffer, NSOpenGLPFAWindow, NULL};

pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; 

m_view = [[NSOpenGLView alloc] initWithFrame:[m_window contentRectForFrameRect:[m_window frame]] 
           pixelFormat:pixel_format]; 
[pixel_format release]; 

GLint dim[2] = {GB_DEF_WINDOW_WIDTH, GB_DEF_WINDOW_HEIGHT};  
CGLContextObj ctx = (CGLContextObj) [[m_view openGLContext] CGLContextObj]; 
CGLSetParameter(ctx, kCGLCPSurfaceBackingSize, dim); 
CGLEnable (ctx, kCGLCESurfaceBackingSize); 

[[m_view openGLContext] makeCurrentContext]; 
[m_window setContentView:m_view]; 

Cela devrait fonctionner, mais lorsque la fenêtre est redimensionnée et après la mise à jour vue OpenGL et la fenêtre , le contenu du tampon arrière ne semble pas être rééchelonné correctement. Qu'est-ce qui ne va pas avec ça?

Merci pour vos réponses.

Répondre

0

Les commandes suivantes de la taille de la mémoire tampon de retour:

GLint dim[2] = {GB_DEF_WINDOW_WIDTH, GB_DEF_WINDOW_HEIGHT}; 

Comment modifier ces auront une incidence sur la taille du tampon arrière. Vérifiez votre code pour définir ces valeurs. Lorsque vous redimensionnez, dites que vous réduisez la taille de la fenêtre, vous devez modifier la valeur de la largeur afin qu'elle ait le même format d'image que la fenêtre. Rappelez-vous que le contenu du tampon arrière n'a pas besoin d'être de la même taille que la vue finale où ils sont affichés. S'il y a une différence, le contenu du tampon sera mis à l'échelle pour s'adapter. Si les proportions sont différentes, vous pourriez vous retrouver avec des étirements étranges.

Questions connexes