【问题标题】:Share Textures Between 2 OpenGL Contexts在 2 个 OpenGL 上下文之间共享纹理
【发布时间】:2018-10-01 17:29:12
【问题描述】:

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

我的共享 openGL 上下文是 CGLContextObj 类型,但我不知道如何处理它,因为我的窗口位于不同的进程中。我已经阅读了有关渲染上下文的 Apple 文档,但如果几乎没有任何示例可供我阅读,我将无法应用他们提出的概念。任何建议将不胜感激,在此先感谢您。

编辑:

也许我没有给出足够的描述,我很抱歉。我将我的 NSOpenGLView 子类化,并在初始化时执行以下操作:

// *** 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 个应用程序中,您是否确认您从窗口 1 获得的纹理包含您认为它包含的内容?纹理中可能没有正确像素的原因有很多,但是如果没有关于您正在做什么的更多信息,就很难说出了什么问题。你能发布纹理创建代码吗?
  • @user1118321 - 在另一个进程中拥有窗口及其视图最初是我的计划,但目前我正在尝试看看我是否可以在一个应用程序中完成。至于你的第二个问题,是的,我 100% 确定纹理 id 是我想要的。这个纹理已经在内部创建了,不幸的是我无法访问它创建的实际代码。
  • 好的,在这种情况下,我认为您需要发布设置 OpenGL 以使用正确纹理的代码,以及用于几何图形的着色器。

标签: objective-c macos opengl


【解决方案1】:

似乎我得到了它的工作,至少部分是因为我不得不通过移动我的窗口来强制重绘视图以实际从主上下文渲染纹理(另一个问题! )。不管怎样,我是这样做的:

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

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

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2013-06-03
    相关资源
    最近更新 更多