我正在开发一个应用程序,它使用2D纹理来创建动画的kaleidoscopes。它开始显示给一个NSOpenGLView。我正在添加一个选项,以切换到全屏模式.
我更喜欢使用OS10.5全屏方法,这样我就可以支持10.5,但如果我使用docs中在“在MacOSXv10.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中。更糟糕的是,在某些情况下,我必须执行字节-swizzling,以使字节顺序正确。这需要几秒钟的大纹理,这就造成了“怀孕暂停”时,进入全屏模式。
在NSOpenGLView和全屏OpenGL上下文之间共享纹理有什么窍门吗?
发布于 2017-05-25 14:34:34
这些天,我在OSX上做了一个共享环境的工作,努力找出一份清单,列出为了让它正常工作而应该做的事情。我认为分享一些小东西或关键词是值得的,它们可以帮助你找出问题所在。
建议:如果没有正确的检查工具(请参阅khronos或开发人员网站的DirectX或NVidia ),使用绘图API (如OpenGL和API)可能会非常痛苦。正确的工具是你首先需要的东西。
NSOpenGLContext,它以相同的像素格式初始化,并将其他上下文作为共享资源的源。太好了!setOpenGLContext方法将它分配给您的NSOpenGLView。(不需要destroyedsetview或我在网上看到的其他东西)xib文件创建了窗口,可以使用NSOpenGLView类的方法awakeFromNib将默认的内容更改为刚创建的
[your_new_Context makeCurrentContext] --我是在awakeFormNib方法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://stackoverflow.com/questions/5143505
复制相似问题