後者是否不贊成前者?glEnableClientState和glEnableVertexAttribArray
我正在編寫代碼,我想在着色器2.0硬件上工作,但我想使用更新的編程約定,如VAO。
所以我一直在使用glVertexAttribPointer
函數代替glVertexPointer
,glNormalPointer
,glColorPointer
等等。
看起來好像我們已經到了服務器 - 客戶端概念不是特別相關的地步(編輯:我的意思是它適用於切換這些緩衝區指針的狀態)。但我想知道舊的En/DisableClientState
實際上的功能以及它與glEnableVertexAttribArray
的實際功能有什麼關係。
而且我也沒有任何圖形硬件從5代以前,但肯定我的軟件的某些用戶可能。例如,我可以如何防止我的代碼無法在Radeon 9700上編譯? (雖然我希望如果用戶擁有最新的驅動程序可能支持新的東西)
使用指針(例如'glVertexAttribPointer'和'glDrawElements')的指針和繪圖調用在綁定緩衝區時都將索引偏移量帶入綁定緩衝區。這意味着這是一個服務器端操作,因爲這些綁定緩衝區已經將其數據傳輸到圖形內存。當它們沒有被綁定時,我需要傳遞一個指向本地緩衝區的指針,這個緩衝區會產生一個客戶端操作。是?否則,你會讓我完全同意最後一句話。 – 2012-01-11 23:49:35
@StevenLu:的確如此。不幸的是,OpenGL API弄亂了指針的僞裝。沒有辦法通過函數來傳遞OpenGL在C中的偏移量,因爲它們在此刻被定義,而不會調用未定義的行爲。要麼給一個指向數字的指針,而不是指向int的指針,或者將函數簽名強制轉換爲uintptr_t,這可能會嚴重地改變參數傳遞的方式。只有理智的解決方案:一個新的OpenGL函數'glVertexAttribOffset' – datenwolf 2012-01-12 10:27:16
是的,我同意這樣做肯定不會造成混淆,使一個不帶指針的版本。我已經看到人們使用一個將char轉換爲NULL的宏,然後爲其添加偏移量。它看起來像指針被解釋爲一個字節偏移整數。 – 2012-01-12 12:09:48