在2个OpenGL上下文之间共享纹理

时间:2018-04-21 00:00:54

标签: objective-c macos opengl

我有一个使用OpenGL 2.1核心配置文件的现有openGL上下文。我能够绘制对象/纹理/等没问题。但是,现在我希望能够让我的应用程序启动一个单独的NSWindow,使用NSOpenGLView,它显示我在原始渲染器视图中绘制的纹理的一部分。经过一番阅读,我最终碰到了上下文共享的主题,我想这可能是我想要解决的问题。

我的共享openGL上下文是类型 - CGLContextObj,但我不知道如何处理它,因为我的窗口驻留在不同的进程中。我已经阅读了关于渲染上下文的Apple文档,但是如果我几乎没有任何示例可以通过,我无法应用他们提出的概念。任何建议都将非常感谢,谢谢你提前。

修改

也许我没有给出足够的描述,道歉。我将我的NSOpenGLView子类化,并且它是init我执行以下操作:

// *** irrelevant initialization stuff above inside init *** //

// Get pixel format from first context to be used for NSOpenGLView when it's finally initialized later
_pixFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:(void*)_attribs];

// We will create CGPixelFormatObj from our C array of pixel format ttributes
GLint nPix;
CGPixelFormatObj myCgPixObj;
CGLChoosePixelFormat(_attribs, &myCgPixOPbj, &nPix);

// Now that we have the pixel format in CGPixelFormatObj form, create CGLContextObj to be passed in later when we init NSOpenGLView
CGLContextObj newContext;
CGLCreateContext(myCgPixObj, mainRenderingContext, &newContext);

// Create an NSOpenGLContext object here to feed into NSOpenGLView
NSOpenGLContext* _contextForGLView = [[NSOpenGLContext alloc] initWithCGLContextObj:newContext];

[newContext setView:self];
[self setOpenGLContext:newContext];

// We don't need this anymore
CGLDestroyPixelFormat(myCgPixObj); 

return self;

我能够在这个视图中绘制对象就好了。但每当我尝试使用在主渲染上下文中创建的纹理时,我会得到一个空白的白色矩形。关于如何从这里开始,我有点迷失,我以前从未处理过共享语境。

1 个答案:

答案 0 :(得分:0)

似乎我得到它的工作,至少部分是因为我必须通过移动我的窗口来强制视图重绘以实际渲染主要上下文中的纹理(另一个问题另一个时间! )。无论如何,这就是我做的方式:

  • 我的主渲染上下文由宿主应用程序提供(是的,我正在处理插件),类型为CGLContextObj。我通过调用NSOpenGLContext
  • 将该上下文包装在initWithCGLContextObj对象中
  • 下一步是创建一个NSOpenGLPixelFormat对象,使用主机应用程序渲染器使用的像素格式属性对其进行初始化。此步骤很重要,因为它确保将在我的视图中使用的呈现上下文具有相同的OpenGL核心配置文件以及主机应用程序使用的其他属性。
  • 然后在我的子类NSOpenGLView,中,我使用NSOpenGLContext进行分配,最好在prepareOpenGL方法中创建一个新的initWithFormat:shareContext:对象。我使用先前创建的NSOpenGLPixelFormatNSOpenGLContext个对象作为参数传递。

在将新创建的上下文分配给我的视图后,我能够从主渲染上下文中渲染纹理。