Ошибка создания NSOpenGLView - PullRequest
       16

Ошибка создания NSOpenGLView

2 голосов
/ 08 ноября 2010

Я пытаюсь создать приложение OpenGL, используя Cocoa API, и к настоящему времени все работает отлично, за исключением одного. При изменении размера главного окна контекст GL не обновляется должным образом.

Вот код, используемый для настройки окна и отображения контекста.

Главное окно:

m_window = [[NSWindow alloc] initWithContentRect:window_rect styleMask:( NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask | NSResizableWindowMask ) backing:NSBackingStoreBuffered defer:YES];</p> <pre><code>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};</p> <pre><code>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 и области просмотра содержимое заднего буфера, похоже, неправильно масштабируется. Что с этим не так?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 11 ноября 2010

Следующие элементы управления размером заднего буфера:

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

То, как вы их измените, повлияет на размер заднего буфера. Проверьте свой код для установки этих значений. Когда вы изменяете размер, скажем, вы делаете окно тоньше, вам придется изменить значение ширины, чтобы оно имело такое же соотношение сторон, что и у окна.

Помните, что содержимое заднего буфера не обязательно должно быть того же размера, что и окончательный вид, в котором они отображаются. Если есть разница, то содержимое буфера будет масштабировано, чтобы соответствовать. Если пропорции отличаются, у вас может получиться странное растяжение.

...