2010-11-07 65 views
2

我想創建一個使用Cocoa API的OpenGL應用程序,現在一切正常,除了一件事情。在調整主窗口的大小時,GL上下文似乎沒有正確更新。錯誤創建NSOpenGLView

下面是用於設置窗口和渲染上下文的代碼。

主窗口:

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]; 

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]; 

這應該工作,但是當調整窗口大小和更新的OpenGL視圖和視後,後臺緩衝區內容似乎不會被正確地重新調整。那有什麼問題?

感謝您的回覆。

回答

0

下控制回緩衝區的大小:

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

你如何改變這些都會影響到後面緩衝區的大小。檢查您的代碼以設置這些值。當您調整大小時,假設您將窗口縮小了,那麼您必須更改寬度值,以便它具有與窗口相同的寬高比。

請記住,後臺緩衝區的內容不需要與顯示它們的最終視圖的大小相同。如果有差異,那麼緩衝區的內容將被縮放以適合。如果長寬比不同,最終可能會出現奇怪的拉伸。