objective-c - 两个 NSOpenGLContext 之间究竟共享什么?

标签 objective-c macos opengl nsopenglview

我正在尝试创建一个 NSOpenGLContext,初始化我的渲染引擎,然后使用来自第一个上下文的共享参数创建新的 NSOpenGLContext。这行不通,在我继续之前,上下文之间究竟共享什么?文档对此有一些说明:

Shared contexts share all texture objects, display lists, vertex programs, fragment programs, and buffer objects created before and after sharing is initiated. The state of the objects is also shared but not other context state, such as current color, texture coordinate settings, matrix and lighting settings, rasterization state, and texture environment settings.

当我创建我的第一个 NSOpenGLContext 时,我初始化我的渲染引擎,它进行以下类型的调用:

  • glGenTextures、glActiveTexture、glBindTexture
  • glEnable
  • glUseProgram、glGetAttribLocation、glGetUniformLocation
  • glUniform1i, glUniform3f
  • glGenVertexArraysAPPLE、glBindVertexArrayAPPLE、glBindBuffer
  • glVertexAttribPointer, glEnableVertexAttribArray

其中大部分用于三种类型的任务 - 创建顶点和着色器程序、在程序中存储对属性和统一位置的引用、创建顶点数组以及绑定(bind)一些纹理。

您是否希望所有这些项目都能跨上下文共享?

最佳答案

函数调用不跨上下文共享。只有对象。并且只有一些对象。

一般来说,共享的对象是那些显然不允许在另一个上下文中重新创建的对象。要么是因为存储了大量数据,要么是设置时间相对较长。

如果你想要一个列表,共享以下对象:

  • 显示列表
  • 纹理
  • 渲染缓冲区
  • 缓冲对象
  • 着色器和程序

未共享的显着对象:

  • 顶点数组对象(进入其中的缓冲区对象是共享的,但不是对象本身)
  • Framebuffer 对象(与 VAO 一样,只有进入其中的内容是共享的)

被共享的对象意味着它在上下文中维护所有状态。因此,如果您从一个上下文修改状态,您将在另一个上下文中看到它。然而,这也意味着如果您使用多线程,您必须同步您对共享 GL 对象的访问。否则可能会出现竞争条件和其他不良情况。

关于objective-c - 两个 NSOpenGLContext 之间究竟共享什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495250/

相关文章:

ios - 表达式不是 iOS 中的整型常量表达式

macos - 在 silverlight 5 中以编程方式禁用硬件加速 h.264 视频解码的任何方法?

c++ - Opengl:如何对使用顶点数组制作的模型进行纹理处理?

javascript - UIWebView 检测 javascript 何时加载新页面

ios - 如何让可滚动的页面 View 左右滑动?

带有分隔符 nsstring 的 iPhone 设备

macos - Dnsmasq 从工作 .dev 更改为 .local

ios - 有没有办法快速从 vImage_Buffer 获取像素格式信息?

opengl - OpenGL中的图像和纹理有什么区别

c++ - 移动到鼠标位置 OpenGL