在没有NSOpenGLView的情况下渲染到IOSurface

时间:2013-04-02 18:24:49

标签: macos opengl

我正在尝试修改Apple MultiGPUIOSurface示例(特别是文件http://developer.apple.com/library/mac/#samplecode/MultiGPUIOSurface/Listings/ServerOpenGLView_m.html),以便服务器端将呈现为IOSurface,而无需NSOpenGLView。

我的修改版本位于:http://pastebin.com/z3r715jJ 我的方法的不同之处在于我是基于计时器渲染到IOSurface,而不是在drawRect中。我也没有使用NSOpenGlView的上下文。

问题是我在客户端应用程序中看到了IOSurface的损坏视图。但是,如果我将NSOpenGLView的上下文设置为我创建的上下文,或者使用NSOpenGLView中的上下文,它就可以工作。这让我觉得NSOpenGLView正在做一些额外的事情,我也需要做,但我不确定是什么。

1 个答案:

答案 0 :(得分:1)

找到解决方案(虽然我不明白为什么):创建一个像素缓冲区。

我发现了一些关于屏幕外缓冲区的讨论以及对drawable(http://www.mentby.com/Group/mac-opengl/opengl-offscreen-rendering-without-a-window.html

的需求

无论如何,我的解决方法是添加以下行:

        NSOpenGLPixelBuffer* pbuf = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_RECTANGLE_EXT textureInternalFormat:GL_RGBA textureMaxMipMapLevel:0 pixelsWide:512 pixelsHigh:512];

    [_nsContext setPixelBuffer:pbuf cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:[_nsContext currentVirtualScreen]];