如何在Mac OS中的NSOpenGLView和全屏上下文之间共享纹理?
我正在开发一个应用程序,它使用2D纹理创建动画万花筒。它开始向NSOpenGLView显示。我添加了一个切换到全屏模式的选项 我更愿意使用OS 10.5全屏方式,这样我就可以支持10.5了,但如果我使用“在Mac OS X v10.6中创建全屏应用程序”文档中描述的方式,我想我也会面临同样的问题 NSOpenGLContext init方法initWithFormat:shareContext:获取一个可选指针,指向“另一个OpenGL图形上下文,其纹理名称空间和显示列表要与接收者共享” 我用于创建全屏OpenGL上下文的代码非常简单:如何在Mac OS中的NSOpenGLView和全屏上下文之间共享纹理?,opengl,fullscreen,textures,sharing,nsopenglview,Opengl,Fullscreen,Textures,Sharing,Nsopenglview,我正在开发一个应用程序,它使用2D纹理创建动画万花筒。它开始向NSOpenGLView显示。我添加了一个切换到全屏模式的选项 我更愿意使用OS 10.5全屏方式,这样我就可以支持10.5了,但如果我使用“在Mac OS X v10.6中创建全屏应用程序”文档中描述的方式,我想我也会面临同样的问题 NSOpenGLContext init方法initWithFormat:shareContext:获取一个可选指针,指向“另一个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上下文之间共享纹理,我是否缺少一些技巧?这些天来,我在OSX上处理共享上下文,努力寻找一个清单,列出应该做的事情,以使其正常工作。我认为有必要与大家分享一些小东西或关键词,它们可以帮助你找出问题所在 建议:在没有正确的检查工具的情况下使用DirectX和OpenGL等绘图API(请参见khronos或NVidia的开发者网站)可能会非常痛苦。正确的工具是你首先需要的
NSOpenGLContext
以相同的像素格式初始化它,并将另一个上下文指定为共享资源的源。太好了李>
setOpenGLContext
方法将其分配给您的NSOpenGLView
。(不需要update
,setview
或我在网上的一篇很老的帖子中看到的其他东西)
- 如果您使用
文件创建了窗口,则可以使用xib
类的NSOpenGLView
方法将默认上下文更改为刚创建的新上下文awakeFromNib
- 附加到视图的旧上下文将自动销毁
- 共享上下文中的任何Prexisiting资源也将“导入”到新上下文中
[your\u new\u Context makeCurrentContext]
-我是在awakeFormNib
方法中完成的希望这能有所帮助。仍然建议阅读。理论上,您只需要为每个上下文创建一次纹理(只要您不每次删除/重新创建上下文)。您还可以测试所拥有的GLuint是否引用了具有GlishTexture的有效纹理