首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Mac中共享NSOpenGLView和全屏上下文之间的纹理?

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

Stack Overflow用户
提问于 2011-02-28 14:51:38
回答 1查看 1.5K关注 0票数 3

我正在开发一个应用程序,它使用2D纹理来创建动画的kaleidoscopes。它开始显示给一个NSOpenGLView。我正在添加一个选项,以切换到全屏模式.

我更喜欢使用OS10.5全屏方法,这样我就可以支持10.5,但如果我使用docs中在“在MacOSXv10.6中创建全屏应用程序”中描述的方法,我想我也会面临同样的问题。

NSOpenGLContext init方法initWithFormat:shareContext:接受指向“另一个OpenGL图形上下文的可选指针,该上下文的纹理名称空间和显示列表要与接收方共享”。

我用来创建全屏OpenGL上下文的代码非常简单:

代码语言:javascript
复制
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中。更糟糕的是,在某些情况下,我必须执行字节-swizzling,以使字节顺序正确。这需要几秒钟的大纹理,这就造成了“怀孕暂停”时,进入全屏模式。

在NSOpenGLView和全屏OpenGL上下文之间共享纹理有什么窍门吗?

EN

回答 1

Stack Overflow用户

发布于 2017-05-25 14:34:34

这些天,我在OSX上做了一个共享环境的工作,努力找出一份清单,列出为了让它正常工作而应该做的事情。我认为分享一些小东西或关键词是值得的,它们可以帮助你找出问题所在。

建议:如果没有正确的检查工具(请参阅khronos或开发人员网站的DirectX或NVidia ),使用绘图API (如OpenGL和API)可能会非常痛苦。正确的工具是你首先需要的东西。

  1. --您创建了一个新的NSOpenGLContext,它以相同的像素格式初始化,并将其他上下文作为共享资源的源。太好了!
  2. 您应该使用setOpenGLContext方法将它分配给您的NSOpenGLView。(不需要destroyed
  3. any、setview或我在网上看到的其他东西)
    • 如果您使用xib文件创建了窗口,可以使用NSOpenGLView类的方法awakeFromNib将默认的内容更改为刚创建的
    • 视图中的旧上下文将自动在共享上下文中被“导入”到新的
    • 中

​

  1. call [your_new_Context makeCurrentContext] --我是在awakeFormNib方法
  2. 中这样做的(我认为这是@Duncan的问题),您需要设置所需的所有呈现状态。呈现状态不是共享的交叉上下文!只有资源。这些是您想要设置的呈现状态(根据您的需要更改它们):

glEnableVertexAttribArray(pgmImageTextureCoord_);glEnableVertexAttribArray(pgmImagePosition_);GL_TEXTURE_2D(GL_TEXTURE_2D);glDisable(GL_DITHER);glDisable(GL_ALPHA_TEST);glDisable(GL_BLEND);glDisable(GL_STENCIL_TEST);glDisable(GL_FOG);glDisable(GL_DEPTH_TEST);glDisable(1.0,1.0);GL_FOG( 0.1,0.1,0.1,1.0);en19#

希望这能帮上忙。仍然建议阅读https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_contexts/opengl_contexts.html。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5143505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档