2012-01-11 59 views
6

後者是否不贊成前者?glEnableClientState和glEnableVertexAttribArray

我正在編寫代碼,我想在着色器2.0硬件上工作,但我想使用更新的編程約定,如VAO。

所以我一直在使用glVertexAttribPointer函數代替glVertexPointer,glNormalPointer,glColorPointer等等。

看起來好像我們已經到了服務器 - 客戶端概念不是特別相關的地步(編輯:我的意思是它適用於切換這些緩衝區指針的狀態)。但我想知道舊的En/DisableClientState實際上的功能以及它與glEnableVertexAttribArray的實際功能有什麼關係。

而且我也沒有任何圖形硬件從5代以前,但肯定我的軟件的某些用戶可能。例如,我可以如何防止我的代碼無法在Radeon 9700上編譯? (雖然我希望如果用戶擁有最新的驅動程序可能支持新的東西)

回答

8

這好像我們已經到了一個地步服務器 - 客戶端的概念是不是......特別相關

其實它非常相關。整個緩衝區對象術語是根據服務器和客戶端。緩衝區是服務器端,客戶端只是發出引用服務器端緩衝區的繪圖命令。

用glEnableVertexAttribArray替換glEnableClientState的主要原因是,由於OpenGL-3總是使用頂點數組(不再有立即模式),並且數據是客戶端或服務器端的區別是由綁定狀態各種緩衝區對象的插槽。如果綁定了緩衝區對象0,則數據是客戶端,如果綁定的緩衝區對象不爲零,則爲服務器端。

+0

使用指針(例如'glVertexAttribPointer'和'glDrawElements')的指針和繪圖調用在綁定緩衝區時都將索引偏移量帶入綁定緩衝區。這意味着這是一個服務器端操作,因爲這些綁定緩衝區已經將其數據傳輸到圖形內存。當它們沒有被綁定時,我需要傳遞一個指向本地緩衝區的指針,這個緩衝區會產生一個客戶端操作。是?否則,你會讓我完全同意最後一句話。 – 2012-01-11 23:49:35

+0

@StevenLu:的確如此。不幸的是,OpenGL API弄亂了指針的僞裝。沒有辦法通過函數來​​傳遞OpenGL在C中的偏移量,因爲它們在此刻被定義,而不會調用未定義的行爲。要麼給一個指向數字的指針,而不是指向int的指針,或者將函數簽名強制轉換爲uintptr_t,這可能會嚴重地改變參數傳遞的方式。只有理智的解決方案:一個新的OpenGL函數'glVertexAttribOffset' – datenwolf 2012-01-12 10:27:16

+0

是的,我同意這樣做肯定不會造成混淆,使一個不帶指針的版本。我已經看到人們使用一個將char轉換爲NULL的宏,然後爲其添加偏移量。它看起來像指針被解釋爲一個字節偏移整數。 – 2012-01-12 12:09:48

相關問題