2011-04-13 37 views
2

我很可能會這樣做的方式錯誤,但我想知道是否有人對如何跟蹤矢量內的非唯一元素的位置有一些建議?如何跟蹤向量中非唯一元素的索引?

我使用glDrawArraysInstanced並使用向量來存儲偏移特定實例位置的翻譯(即第一個元素是x翻譯,第二個y,第三個z,重複)。這個向量被放入一個緩衝區,並且繪圖按預期工作,並且使用實例化可以提高性能。我不想根據gl_InstanceID設置位置,因爲ID根據實例的數量而變化,但我需要實例保持一致。

當試圖使實例的數量變爲動態時,問題就出現了;我需要能夠有效地添加和刪除矢量中的元素,而不必在每次更改時重新構建整個矢量。不過,我不確定如何確定翻譯在矢量內部的確切位置。


作爲一個例子:

  • 實例0使用翻譯0,1,2
  • 實例1使用翻譯3,4,5-
  • 實例2使用翻譯6,7,8

要刪除實例1:

我可以存儲翻譯的x分量的指數時,翻譯後首先構造,所以我知道我需要.erase 3個元素開始於3

要刪除實例2:

怎麼辦我知道這個例子的起始索引是什麼?施工期間儲存的指數不再有效。


我知道這種情況下是微不足道的,我可以只從最初存儲的索引減,但如果我有說40000個實例是有一個有效的方式來永遠知道具體的翻譯該實例是矢量內?在多次添加/刪除實例之後,指數可以轉移相當數量。

注:我想使用矢量,因爲OpenGL需要float *來填充緩衝區。我可以很容易地在實例和位置之間使用地圖,但是在某些時候,我仍然需要將所有位置放在一起進行渲染。如果我在這一點上遺漏了一些明顯的東西,請讓我知道。更換緩衝區似乎不會影響性能,但是當某些變化太慢時重建整個位置矢量。

希望這不是太多的文字牆..任何幫助將不勝感激。

回答

0

改爲使用「GLDrawElementsInstanced」,以便不需要更改平移向量(只對索引重新排序)。

更新:(真正的答案:)

綁定改造緩衝區(用所有的轉化,包括不可見的情況下)爲TBO,然後訪問它作爲着色器的紋理。爲每個實例提供一個索引屬性(glVertexAttribDivisor = 1),以用作從翻譯紋理中獲取的座標。

這樣您只需要修改索引緩衝區並將新的翻譯附加到翻譯緩衝區。在某些情況下,您可以通過刪除未使用的值來執行轉換緩衝區的清理過程。

+0

我知道使用它會比一般的複製頂點好,但我不知道這將如何幫助這種情況。你能詳細說明一下嗎?我使用「glVertexAttribDivisor」從每個實例向量傳遞一個翻譯,所以我需要翻譯向量來僅保存當前所需的翻譯。然後將該翻譯添加到頂點着色器內部的位置。當某些東西被刪除並且添加了其他東西時,所使用的翻譯不一定是相同的,但它可以被添加到完全不同的位置。 – John 2011-04-13 18:30:12

+0

@John。我明白你的意思。你需要實例的索引,但不是頂點......當然,不要在意我的答案,我會稍微考慮一下,稍後再編輯它。 – kvark 2011-04-13 19:27:19

+0

謝謝,我會給你一個鏡頭。似乎要好好保留一些看不見的東西,而不是最終會遇到一些過於複雜的算法。 – John 2011-04-13 21:38:49