我使用OpenGL和GLSL開發了一個小型3D引擎。是否可以將函數'glMultiDrawElements'使用索引緩衝區對象(IBO)?
我已經合併了一個頂點數據批處理系統,其目標是收集共享相同着色器程序和相同轉換的唯一頂點緩衝區對象(VBO)中的所有幾何圖形(所有對象),從而最大限度地減少狀態變化(綁定)並且也可以畫電話。
我目前使用函數'glMultiDrawElements'來渲染特定的一批數據(所以一個繪製調用)。所以,例如,如果我在我的批處理3網格中,我也有3個索引數組(一個用於每個網格)組織在'GLvoid **'數組(雙數組)中。因此,爲了呈現我的3個網格,我有一個獨特的glMultiDrawElements調用,但我必須直接傳遞給參數中double元素的函數。如果可以將所有元素(元素的雙數組)存儲在索引緩衝區對象(IBO)中(比如可以使用glDrawElements - >這裏是一個簡單的例子),但我想知道(對於性能問題)數組元素)並在glMultiDrawElements調用之前綁定它...我不這麼認爲,因爲它是一個雙數組而不是簡單的數組,但也許(我希望如此),我錯了。
下面是使用glDrawElements(僞代碼)的例子:
[...]
//Setup data
[...]
#define OFFSET_BUFFER(offset) ((char*)NULL + offset)
foreach (pMeshGeometry from meshes) //iterates for each mesh of the scene
{
pMeshGeometry->GetIndexBuffer().Lock(); //Bind IBO
{
glDrawElements(pMeshGeometry->GetPrimitiveType(),
pMeshGeometry->GetIndexBufferSize(), pMeshGeometry->GetIndexBuffer().GetType(), OFFSET_BUFFER(0)); //Render a specific mesh eccording to indices
}
}
目前我使用glMultiDrawElement這樣:
glMultiDrawElements(GL_TRIANGLES, &this->m_CountElementArray[0], GL_UNSIGNED_INT,
(const GLvoid **)&this->m_IndexAttribArray[0], this->m_CountElementArray.size()); //I enter the array of pointer directly in parameter
所以,也許對下面的例子應該是可能的:
#define OFFSET_BUFFER(offset) ((char**)NULL + offset) //Something like this
glMultiDrawElements(GL_TRIANGLES, &this->m_CountElementArray[0], GL_UNSIGNED_INT,
OFFSET_BUFFER(0), this->m_CountElementArray.size()); //Something like this
所以,如果這是不可能的,我想到了函數'glDrawRangeElemen TS'。對於我的3個網格到一個獨特的VBO的例子,我只需要在每個glDrawRangeElements調用之前綁定一個IBO(這裏,3爲每個網格繪製調用 - >這樣一個glDrawRangeElements循環)。所以這裏顯然可以使用IBO。
這種方法肯定會有效,但我認爲它不是最好的!我認爲可以使用glMultiDrawElements和IBO做到這一點,但我不知道如何做到這一點。
或者這可能是不可能的。也許事實上,在參數數組中輸入directy比使用glDrawRangeElements和它的IBO的方法快,所以在這種情況下IBO的使用可能被棄用,因此不適用。
您對此有何看法?
_請使用一些換行符。這個巨大的段落幾乎不可能閱讀。 –
你到底在問什麼?即使有換行符,我也不確定。 – Aumnayan
對不起,我認爲這很清楚。總結一下,我想知道是否可以在glMultiDrawElements中使用IBO,而不是直接在參數中使用雙數組索引。 – user1364743