2013-05-29 83 views
0

我有一個很難用常見的例子使用了OpenGL規範(version 3.1,第27頁)匹配所有在互聯網上。澄清GL.DrawElements的參數

OpenGL的規範版本DrawElements 3.1規定:

命令

void DrawElements(enum mode, sizei count, enum type, void *indices); 

通過連續傳送 計數元件,其索引被存儲在當前綁定的元件構造的幾何圖元的序列陣列 緩衝液(見第2.9.5節),在由索引到GL中定義的偏移。通過DrawElements傳送的第i個元素將從元素索引採取[I]的 每個已啓用的陣列。

我傾向於解釋爲如下:

該指數參數保存至少計數型類型值。其元素用作實際元素緩衝區的偏移量。因爲對於DrawElements的每次使用的元素緩衝區必須當前綁定的,我們其實有2套強制性這裏指標:一個要素緩衝器和另一個指標陣列英寸

這似乎在某種程度上浪費在大多數情況下。除非必須繪製一個由元素數組緩衝區定義的模型,但由於透明度等原因需要將其元素排序回去。但是,我們如何實現使用普通元素數組緩衝區進行渲染(不進行排序)呢?

現在,足夠奇怪的是,互聯網上大多數示例和教程(here,here半頁向下的'Indexed drawing'。)給出了一個整數作爲索引參數,大多數情況下它是0。它總是隻有一個整數偏移 - 顯然沒有數組爲指數參數!

我已經用一些NVIDIA圖形成功地使用了最後一個變體(給出了單個指針化的整數,用於索引)。但是我在英特爾芯片上遇到了崩潰。我想知道,誰是錯誤的:我,規範或成千上萬的例子。什麼是DrawElements的正確參數和用法?如果允許使用單個整數,那麼這與規範一致嗎?

回答

1

自從OpenGL-1.1以來,您正在甩開傳統glDrawElements。當時沒有維也納各組織,但只是客戶端陣列,並且該程序實際上給索引的指針(= C語言中的陣列)到緩衝器/陣列與GL ...指針功能設置。

與索引緩衝區

現在,參數實際上只是一個偏移到服務器端緩衝區。你可能會在這太問題很感興趣:What is the result of NULL + int?

此外,我給了一個詳盡的答案,我強烈建議閱讀https://stackoverflow.com/a/8284829/524368

我寫什麼函數簽名和類型轉換也適用於glDraw ...電話。

+0

我很欣賞你的答案。你能否給出一些官方參考的鏈接,說明行爲已經發生了變化(並且將GL標誌標記爲假)? – user492238

+2

@ user492238:Spec沒有錯。如果你在頭腦中讀到一些錯誤的期望,可能有點誤導。它明確指出:「索引存儲在當前綁定的元素數組緩衝區中(參見第2.9.5節)在由索引定義的偏移量處」,然後繼續提及索引[i],索引[i]僅僅是C中的索引+ i類規範使用的語法,這將是緩衝區中的字節偏移索引+ sizeof(type)* i。 – derhass

+0

如果規範在旁註或其他內容中發現了奇怪的行爲,我會節省幾個小時,並且會更加快樂。另外,如果'indices'是一個指針,'indices + i'看起來非常像'indices [i]' –