OpenGL не рендерится на MacOS Mojave - PullRequest
0 голосов
/ 23 октября 2018

Если вы создадите NSView и пользовательский NSOpenGLContext в MacOS Mojave, окно не будет отображаться до тех пор, пока оно не будет изменено.Но все работает, если вы используете NSOpenGLView вместо этого.Я вижу много хаков, которые изменяют размер окна программно (http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp) перед рендерингом в него или дважды вызывают [NSOpenGLContext update] (https://github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77),), но они кажутся действительно хакерскими и ненадежными.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

В моем подклассе NSView, который управляет NSOpenGLContext вручную, мне нужно было вызвать NSView.displayIfNeeded вместо NSView.display для замены буфера.Переопределение NSView.setLayer и вызов NSOpenGLContext.update не помогли.

Обратите внимание, что мое использование похоже на SDL, где я использую пользовательский цикл выполнения, так что это может быть не так в программе постеров.

0 голосов
/ 09 марта 2019

После обновления до Mojave 10.14.3 и Xcode 10.1 эта проблема была исправлена.

0 голосов
/ 23 октября 2018

Я разобрал фреймворки Apple и обнаружил, что они изменили работу рендеринга OpenGL в Mojave.Кажется, что даже если вы отключите многоуровневую поддержку, установив NSView s wantsLayer на NO, NSView все равно создает и присоединяет слой к вашему виду в Mojave.Изменение размера окна перед его рендерингом работает, потому что это обычно приводит к вызову [NSOpenGLContext update].Вызов обновления дважды работает, потому что в первом кадре NSView нет прикрепленного к нему слоя, а метод обновления ничего не делает, кроме второго кадра, слой находится там, и [NSOpenGLContext update] фактически инициализирует буфер кадра.

Таким образом, решение состоит в том, чтобы вызывать [NSOpenGLContext update] вручную всякий раз, когда установлен слой NSView, например:

@interface OpenGLView: ViewMacOS
{
    NSOpenGLContext* _openGLContext;
}
@end

@implementation OpenGLView

-(void)setLayer:(CALayer*)layer
{
    [super setLayer:layer];

    [_openGLContext update];
}

@end

Я проверил его, и он работает как на Mojave, так и на старых версиях macOS([NSView setLayer:] не вызывается в macOS 10.13 и более ранних версиях).Вот полный коммит, который я сделал для двигателя Ouzel: https://github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3

...