gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:09 25 4
gpt4 key购买 nike

我正在尝试创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com