Я работаю над приложением, которое использует 2D текстуры для создания анимированных калейдоскопов. Он начинает отображаться в NSOpenGLView. Я добавляю опцию для переключения в полноэкранный режим.
Я бы предпочел использовать подход OS 10.5 для полноэкранного режима, чтобы я мог поддерживать 10.5, но я думаю, что столкнулся бы с той же проблемой, если бы я использовал подход, описанный в документации в разделе «Создание полноэкранного приложения в Mac» OS X v10.6 ".
Метод инициализации NSOpenGLContext initWithFormat: shareContext: принимает необязательный указатель на «Другой графический контекст OpenGL, чье пространство имен текстуры и списки отображения, которые вы хотите передать получателю».
Код, который я использую для создания полноэкранного контекста OpenGL, прост:
NSOpenGLPixelFormatAttribute myAttributes[] = // Pixel Format Attributes for the FullScreen NSOpenGLContext
{
NSOpenGLPFAFullScreen, // specify full-screen OpenGL context
NSOpenGLPFAScreenMask,
CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), // specify main display
NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) 32,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 0,
NSOpenGLPFAStencilSize, 0,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAAccelerated,
0
};
NSOpenGLPixelFormat *myPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:myAttributes]; // Create FullScreen NSOpenGLContext with these attributes
NSOpenGLContext *fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:myPixelFormat shareContext: myContext]; // Create an NSOpenGLContext with the FullScreen pixel format.
Однако, похоже, это не работает.
Мое приложение использует только одну текстуру, поэтому я начал с использования glGenTextures и glBindTexture. Вместо этого я просто использовал текущую текстуру для контекста.
Я попытался изменить свой код для создания именованной текстуры с помощью glGenTextures, в надежде, что смогу связать именованную текстуру после перехода в полноэкранный контекст, но без кубиков. Оба подхода дают одинаковый результат - текстура не работает в полноэкранном контексте.
Я не получаю никаких ошибок, но рисование с текстурой ничего не делает.
Я вынужден пересоздавать свою текстуру каждый раз, когда я переключаюсь в полноэкранный режим. Это плохо, потому что текстуры потенциально очень большие (в зависимости от размера изображения, загружаемого пользователем, вплоть до максимального размера текстуры). Это заставляет меня загружать две копии очень большого объекта в VRAM. Хуже того, в некоторых случаях мне приходится выполнять обход байтов, чтобы получить правильный порядок байтов. На большую текстуру уходит несколько секунд, что делает «беременную паузу» при входе в полноэкранный режим.
Есть ли какая-то хитрость, которой мне не хватает для совместного использования текстур между NSOpenGLView и полноэкранным контекстом OpenGL?