【发布时间】: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