2012-02-29 70 views
4

我想創建一個NSOpenGLContext,初始化我的渲染引擎,然後使用第一個上下文中的共享參數創建新的NSOpenGLContexts。這是行不通的,在我繼續之前,上下文之間究竟分享了什麼?該文檔有點亮:兩個NSOpenGLContexts究竟分享了什麼?

共享上下文共享共享啓動前後創建的所有紋理對象,顯示列表,頂點程序,片段程序和緩衝區對象。對象的狀態也是共享的,但不是其他上下文狀態,例如當前顏色,紋理座標設置,矩陣和照明設置,柵格化狀態以及紋理環境設置。

當我創建我的第一個NSOpenGLContext,我初始化我的渲染引擎,這使得下列類型的呼叫:

  • glGenTextures,glActiveTexture,glBindTexture
  • glEnable
  • glUseProgram,glGetAttribLocation,glGetUniformLocation
  • glUniform1i,glUniform3f
  • glGenVertexArraysAPPLE,glBindVertexArrayAP PLE,glBindBuffer
  • glVertexAttribPointer,glEnableVertexAttribArray

其中大多數是出於三個類型的任務 - 創造頂點和着色器程序,存儲參考ATTRIB和計劃內統一的位置,創造頂點數組,並結合幾紋理。

您希望所有這些項目能夠在上下文中共享嗎?

回答

4

函數調用不通過上下文共享。只有對象。而且只有一些的對象。

一般來說,共享的對象是那些明顯禁止在另一個上下文中重新創建的對象。要麼是由於存儲大量數據,要麼是相對較長的設置時間。

如果你想有一個名單,以下對象共享:

  • 顯示列表
  • 紋理
  • Renderbuffers
  • 緩衝區對象
  • 着色器和程序

顯着不共享的對象:

  • 頂點數組的對象(即去其中的緩衝器的對象是共享的,但不是該對象本身)
  • Framebuffer的對象(如VAOs,只有去在其中被共享的東西)

被共享的對象意味着它在整個上下文中保持所有狀態。所以如果你從一個上下文中修改狀態,你會在另一個上下文中看到它。但是,這也意味着如果您使用多個線程,則必須同步您對共享GL對象的訪問。否則會出現競賽狀況和其他不良情況。