N在我的 opengl 程式(opengl 3.3 核心組態檔)中,我有一個包含浮點元素的陣列。我將陣列傳遞給 VBO 并將其指定為 index 處的頂點屬性陣列0。這data是陣列:
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, sizeof(float), (void*)0);
我希望每個實體的屬性更新一次,所以
glVertexAttribDivisor(0, 1);
問題是當程式被告知N * N通過呼叫來繪制物件的實體時會發生什么glDraw*Instanced()?
陣列中只有N元素,所以我猜第一個N實體將按預期繪制。但在那之后會發生什么?它是否會再次回圈遍歷陣列以繪制另一組N實體,然后再次繪制另一個實體,然后再繪制另一個實體,依此類推,直到繪制所有實體?或者它是否會將屬性0視為設定為NULL或其他N * (N - 1)實體?如果是這樣,有沒有辦法讓它如上所述回圈遍歷陣列?
我能想到的唯一解決方案是不使陣列實體化并將其大小更改為N * N重復N時間內的值,但這會占用不必要的記憶體量。
uj5u.com熱心網友回復:
如果渲染的頂點多于緩沖區物件中的存盤量,則會發生完全相同的事情:越界讀取。如果在您的背景關系中啟用了健壯的記憶體訪問,則此值將為零或緩沖區物件存盤中的某個其他值。但是,如果沒有可靠的訪問,越界讀取會導致未定義的行為,并且“可能導致 GL 中斷或終止”。
所以……不要那樣做。
如果是這樣,有沒有辦法讓它如上所述回圈遍歷陣列?
它必須是那樣嗎?
您傳遞給的除數glVertexAttribDivisor是除數。如果它不為零,它將獲取實體索引并將其除以除數,并將該結果用作實體陣列的索引。因此,如果您N作為除數傳遞,這意味著第一個N實體從索引 0 獲取值,下一個N實體從索引 1 獲取值,等等。
這將以與您想要的“回圈”行為不同的順序迭代,但它最終會做同樣的事情。
請注意,除非有一些其他實體陣列涉及不同的除數或您的頂點著色器使用gl_InstanceID,否則所有這些都會渲染相同的N時間。這可能沒有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521610.html
標籤:C opengl顶点属性
