我有一個很難用常見的例子使用了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的正確參數和用法?如果允許使用單個整數,那麼這與規範一致嗎?
我很欣賞你的答案。你能否給出一些官方參考的鏈接,說明行爲已經發生了變化(並且將GL標誌標記爲假)? – user492238
@ user492238:Spec沒有錯。如果你在頭腦中讀到一些錯誤的期望,可能有點誤導。它明確指出:「索引存儲在當前綁定的元素數組緩衝區中(參見第2.9.5節)在由索引定義的偏移量處」,然後繼續提及索引[i],索引[i]僅僅是C中的索引+ i類規範使用的語法,這將是緩衝區中的字節偏移索引+ sizeof(type)* i。 – derhass
如果規範在旁註或其他內容中發現了奇怪的行爲,我會節省幾個小時,並且會更加快樂。另外,如果'indices'是一個指針,'indices + i'看起來非常像'indices [i]' –