簡體   English   中英

將兩個不同的網格放在同一個頂點 VBO 中的 OpenGL 最佳實踐

[英]OpenGL best practice for putting two different mesh in the same vertex VBO

經過一番搜索,據說分離的 VAO 共享完全相同的着色器屬性布局,將它們合並為一個 VAO 並將所有這些數據放入一個 VBO,這樣我就可以只用一次繪制調用來繪制這些對象。

這完全有道理,但是統一變量呢? 說我想畫樹和球。 它們具有不同的頂點數,具有不同的變換,但共享完全相同的着色器程序。

直到現在,我的程序就像

// generate VAOs, called only once

glGenVertexArray(1, &treeVaoId);
// generate VBO and bind tree vertices
// enabled vertex attribute and set it for shader program

glGenVertexArray(1, &ballVaoId);
// repeat for ball


// draw, called each frame

// give the tree's transform to shader as uniform
glDrawArrays(...) // first draw call

// repeat for ball
glDrawArrays(...) // second draw call

並將這些頂點連接到一個 VAO 和 VBO,例如:

glGenVertexArray(1, &treeBallId);
// generate enough size of VBO and bind tree vertices and ball vertices after it.
// enabled vertex attribute and set it for shader program

// to draw, I have to separately give transform to it's uniform to each tree and ball, but how?
glDrawArrays(...)

對不起,舉個例子,但重點是,有沒有辦法在繪制一個 VAO 時給出不同的統一變量? 或者,我的方法完全錯誤嗎?

批處理的目的是通過最小化繪制調用之間的狀態變化來提高性能(批處理將它們減少到 0,因為繪制調用之間沒有任何內容)。 然而,性能提升是有程度的,並不是所有的狀態變化都是平等的。

狀態更改成本范圍內,更改程序制服是成本最低的狀態更改。 這並不是說它沒有意義,而是您應該考慮與從中獲得的結果相比,您真正想要花費多少努力。 特別是如果您沒有盡快推動硬件。

VAO 更改(即非緩沖區更改)屬於更昂貴的狀態更改,因此通過消除它們您可以獲得很多。

顧名思義,在一次繪制調用中,不能uniform變量從一個着色器實例更改為另一個着色器實例。 甚至是多次繪制調用。 但這並不意味着沒有什么可以做的。

多繪圖功能允許您在單個函數調用中發出多個繪圖調用。 這些單獨的繪制可以從頂點和索引緩沖區的不同部分獲取它們的頂點數據。 您需要的是一種與您的頂點着色器進行通信的方法,它參與了哪個繪制調用,以便它可以索引某種數組以提取該繪制調用的每個對象數據。

半新硬件 可以訪問gl_DrawID ,它是正在執行的特定繪圖調用的多繪圖命令的索引。 ARB_shader_draw_parameters 擴展得到了相當廣泛的實現 您可以使用該索引從 UBO 或 SSBO 獲取每個對象的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM