當前位置: 妍妍網 > 碼農

音視訊、渲染引擎崗位面試相關, OpenGL 高頻知識點

2024-04-03碼農

OpenGL 共享上下文使用場景?有哪些資源可以共享?

多執行緒渲染或者跨視窗渲染,共享上下文可以使得多個執行緒、視窗之間能夠共享 OpenGL 物件(如紋理、shader 等)和狀態資訊,避免了在多個上下文之間頻繁地進行數據拷貝和同步操作,減少資源消耗,提高效能。

可以共享的資源:

  • 紋理;

  • shader;

  • program 著色器程式;

  • buffer 類物件,如 VBO、 EBO、 RBO 等 。

  • 不可以共享的資源:

  • FBO 幀緩沖區物件(不屬於 buffer 類);

  • VAO 頂點陣列物件(不屬於 buffer 類)。

  • 這裏解釋下,在不可以共享的資源中,FBO 和 VAO 屬於資源管理型物件,FBO 負責管理幾種緩沖區,本身不占用資源,VAO 負責管理 VBO 或 EBO ,本身也不占用資源

    註意, 每個執行緒同時只能繫結(eglMakeCurrent)一個 Context ,但可以按順序切換不同 Context。

    幀緩沖區物件 FBO 的作用?

    FBO 即幀緩沖區物件,實際上是一個可添加緩沖區的容器,用於管理渲染到紋理或渲染到螢幕之外的其他影像緩沖區的過程。

    幀緩沖區物件,渲染緩沖區物件和紋理

    FBO 本身不能用於渲染,只有添加了紋理或者渲染緩沖區之後才能作為渲染目標,它僅且提供了 3 種附著(Attachment),分別是 顏色附著、深度附著和樣版附著

    離屏渲染和多重渲染目標都是基於幀緩沖區物件實作。

    離屏渲染: 允許將渲染結果輸出到一個紋理或渲染緩沖區,而不是直接輸出到螢幕上。 這對於實作一些高級渲染技術,如後期處理、陰影對映、抗鋸齒等是至關重要的。

    多重渲染目標(MRT): 允許同時渲染到多個顏色附件,這對於一次性生成多個顏色通道的數據非常有用 ,例如渲染到不同的紋理或渲染緩沖區以進行後續處理。

    參考文章:

    如何傳輸一個超大陣列到著色器?

    1. 使用將陣列載入到 2D 紋理的方式,然後使用 texelFetch 取數據;

    2. 使用 uniform 緩沖區物件,即 UBO ;

    3. 使用紋理緩沖區物件,即 TBO 。

    參考我的文章:

    什麽是頂點陣列物件 VAO 和頂點緩沖區物件 VBO ,為什麽要使用它們?

    VBO(Vertex Buffer Object)是指頂點緩沖區物件,VAO(Vertex Array Object)是指頂點陣列物件。

    OpenGL ES 2.0 編程中,用於繪制的頂點陣列數據首先保存在 CPU 記憶體,在呼叫 glDrawArrays 或者 glDrawElements 等進行繪制時,需要將頂點陣列數據從 CPU 記憶體拷貝到視訊記憶體。

    但是很多時候我們沒必要每次繪制的時候都去進行記憶體拷貝,如果可以在視訊記憶體中緩存這些數據,就可以在很大程度上降低記憶體拷貝帶來的開銷。

    OpenGL ES 3.0 VBO 出現就是為了解決這個問題。

    VBO 的作用是在視訊記憶體中提前開辟好一塊記憶體,用於緩存頂點數據,從而避免每次繪制時的 CPU 與 GPU 之間的記憶體拷貝 ,可以提升渲染效能,降低記憶體頻寬和功耗

    VAO 的主要作用是用於管理 VBO ,減少 glBindBuffer 、glEnableVertexAttribArray、 glVertexAttribPointer 這些呼叫操作,高效地實作在頂點陣列配置之間切換。

    詳細參考文章:

    glFlush 和 glFinish 有什麽區別

    一般來說,我們在使用 OpenGL 的時候,指令不是立即執行的。它們首先被送到指令緩沖區,然後才被送到硬體執行。

    glFinish 和 glFlush 都是強制將命令緩沖區的內容送出給硬體執行。

    1)glFlush:
    glFlush 清空緩沖區,將指令送往緩硬體立即執行, 但是它是將命令傳送完畢之後立即返回,不會等待這些指令執行完畢 。這些指令會在有限時間內執行完畢

    2)glFinish
    glFinish 將緩沖區的指令立即送往硬體執行,但是要一直等到硬體執行完這些指令之後才返回

    如果直接繪制到前緩沖,那麽在你想保存螢幕截圖之前,就需要呼叫這個函式,確保繪制完畢。如果使用雙緩沖,則這個函式不會有太大作用

    如果呼叫 glFinish,通常會帶來效能上的損失。因為它會是的 GPU 和 CPU 之間的並列性喪失。 一般,我們送出給驅動的任務被分組,然後被送到硬體上(在緩沖區交換的時候)

    如果呼叫 glFinish,就強制驅動將命令送到 GPU。然後 CPU 等待直到被傳送的命令全部執行完畢。

    這樣在 GPU 工作的整個期間內,CPU 沒有工作(至少在這個執行緒上)。而在 CPU 工作時(通常是在對命令分組),GPU 沒有工作。因此造成效能上的下降。

    3) glFlush 和 glFinish 區別
    一般使用 glFlush 的目的是確保在呼叫之後,CPU 沒有 OpenGL 相關的事情需要做,命令會送到硬體執行。呼叫 glFinish 的目的是確保當返回之後,沒有相關工作留下需要繼續做

    參考文章:

    頂點著色器、片段著色器的作用分別是什麽?

    頂點著色器和片段著色器分別在圖形渲染管線的不同階段執行特定的任務。

    頂點著色器用於處理輸入到圖形渲染管線的頂點數據,對每個輸入頂點進行處理和變換,例如 MVP 矩陣變換、光照計算。

    片段著色器負責確定圖形中每個片段的最終顏色值,也就是用於產生顏色。

    -- END --

    進技術交流群, 掃碼添加我的微信:Byte-Flow

    獲取相關資料和源碼

    學習音視訊、OpenGL ES、Vulkan 、Metal、影像濾鏡、視訊特效及相關渲染技術的付費社群,面試指導,1v1 簡歷服務,職業規劃。

    我的付費社群

    推薦: