如何在Mac OS中的NSOpenGLView和全屏上下文之间共享纹理?

如何在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图形上下文,其纹理名称空间和显示列表要与接收者共享” 我用于

我正在开发一个应用程序,它使用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上下文之间共享纹理,我是否缺少一些技巧?

这些天来,我在OSX上处理共享上下文,努力寻找一个清单,列出应该做的事情,以使其正常工作。我认为有必要与大家分享一些小东西或关键词,它们可以帮助你找出问题所在

建议:在没有正确的检查工具的情况下使用DirectX和OpenGL等绘图API(请参见khronos或NVidia的开发者网站)可能会非常痛苦。正确的工具是你首先需要的

  • 您创建了一个新的
    NSOpenGLContext
    以相同的像素格式初始化它,并将另一个上下文指定为共享资源的源。太好了
  • 您应该使用
    setOpenGLContext
    方法将其分配给您的
    NSOpenGLView
    。(不需要
    update
    setview
    或我在网上的一篇很老的帖子中看到的其他东西)
    • 如果您使用
      xib
      文件创建了窗口,则可以使用
      NSOpenGLView
      类的
      awakeFromNib
      方法将默认上下文更改为刚创建的新上下文
    • 附加到视图的旧上下文将自动销毁
    • 共享上下文中的任何Prexisiting资源也将“导入”到新上下文中
  • 调用
    [your\u new\u Context makeCurrentContext]
    -我是在
    awakeFormNib
    方法中完成的
  • (这里我认为是@Duncan的问题),您需要设置所有需要的渲染状态。呈现状态不是共享的跨上下文!只有资源。这些是要设置的一些渲染状态(根据需要进行更改):

    GlenableVertexAttributeArray(pgmImagePosition_u2;); GlenableVertexAttributeArray(PGMImageTextureCord); glEnable(GL_纹理_2D); glDisable(GLU抖动); glDisable(GLU阿尔法测试); glDisable(GLU混合); glDisable(GLU模板测试); glDisable(GLU雾); glDisable(GLU深度测试); glPixelZoom(1.0,1.0); glClearColor(0.1,0.1,0.1,1.0)


  • 希望这能有所帮助。仍然建议阅读。

    理论上,您只需要为每个上下文创建一次纹理(只要您不每次删除/重新创建上下文)。您还可以测试所拥有的GLuint是否引用了具有GlishTexture的有效纹理