我正在开发一个使用 2D 纹理创建动画万花筒的应用程序。它开始显示到 NSOpenGLView。我正在添加一个切换到全屏模式的选项。
我更喜欢将 OS 10.5 方法用于全屏,这样我就可以支持 10.5,但我认为如果我使用“在 Mac OS X v10 中创建全屏应用程序”下的文档中描述的方法,我会面临同样的问题.6"。
NSOpenGLContext init 方法 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 上下文之间共享纹理是否缺少一些技巧?