Подкласс NSOpenGLView не изменяет размер окна

Я пытался заставить NSOpenGLView правильно изменять размер при изменении размера окна, но я продолжаю получать странное поведение, которое не могу объяснить. Это выглядит так:

Оригинал (Как это выглядит в начале):

После изменения размера:

Это мой код изменения размера:

- (void)reshape
{
    [super reshape];

    CGLLockContext([[self openGLContext] CGLContextObj]);

    NSRect viewRectPoints = [self bounds];

#if SUPPORT_RETINA_RESOLUTION

    NSRect viewRectPixels = [self convertRectToBacking:viewRectPoints];

#else //if !SUPPORT_RETINA_RESOLUTION

    NSRect viewRectPixels = viewRectPoints;

#endif // !SUPPORT_RETINA_RESOLUTION

    [self resizeWithWidth:viewRectPixels.size.width
                  AndHeight:viewRectPixels.size.height];

    CGLUnlockContext([[self openGLContext] CGLContextObj]);
}

- (void) resizeWithWidth:(GLuint)width AndHeight:(GLuint)height
{
    glViewport(0, 0, width, height);

    m_width = width;
    m_height = height;
}

и я использую: "glViewport(0, 0, m_width, m_height);" всякий раз, когда я вызываю glDrawArrays();

Кто-нибудь может помочь?


person user4719016    schedule 27.03.2015    source источник
comment
Вы также можете опубликовать свою функцию drawRect?   -  person Ronald S. Bultje    schedule 19.04.2015


Ответы (2)


При изменении размера окна вы также должны установить матрицу проекции, чтобы отразить новые размеры. Вы не опубликовали свой код настройки/рисования, но обычно это выглядит примерно так:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...); // or glFrustum(), glOrtho(), gluOrtho2D(), ...
glMatrixMode(GL_MODELVIEW);
person Max Smolens    schedule 04.04.2015

Серьезно, в эти дни вы, возможно, захотите оставить NSOpenGLView позади и перейти на CAOpenGLLayer напрямую.

У меня было слишком много проблем с этим глупым классом, чтобы больше беспокоиться о NSOpenGLView и в представлениях, поддерживаемых слоями, особенно наличие CAOpenGLLayer IMHO просто дает вам больше гибкости - и контроля.
(и меньше ошибок - попробуйте заставить NSOpenGLView работать в иерархия представлений с поддержкой слоев ниже 10.9 или ранее..).

Плюс дополнительные функциональные возможности прямо из коробки — или, по крайней мере, под рукой (например, встроенная поддержка CVDisplayLink).

Только мой 2с.

person Jay    schedule 28.08.2015