2011-08-04 27 views
2

在我見過的所有例子中,這些線繪製網格之前使用: glEnableClientState(GL10.GL_VERTEX_ARRAY); glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);啓用客戶端狀態的目的是什麼?

有時glEnableClientState(GL10.GL_NORMAL_ARRAY);

,然後將這些總是在繪圖調用每個月底再次被禁用目。

我真的不明白他們實際上做的,爲什麼你想禁用它們。我知道我可能需要打開它們,如果我從數組中繪製三角形,使用紋理和使用光照。但我不知道我什麼時候需要關閉它們。

我相信這將是更有效不要禁用並在場景中重新啓用這些每個網格如果你不就得了。你可以隨時離開他們嗎?在什麼情況下你需要禁用它們?

我一直沒能找到這些客戶端狀態的實際意義任何解釋,所以我不知道在哪裏可以安全地在我的代碼讓它們打開或關閉。

回答

4

你可以隨時離開它們嗎?

是的,如果你想,並且如果你所有的基元都使用了你所啓用的所有數組。

在什麼情況下你需要禁用它們?

爲了不破壞亂七八糟向上下一附圖。例如,假設你有一個使用法線的原始函數,你可以通過調用glEnableClientState(GL_NORMAL_ARRAY)來啓用它,並告訴OpenGL你的正常數據在哪裏通過glNormalPointer()。如果你不禁用GL_NORMAL_ARRAY,你的下一個基元將使用與你之前的基元相同的普通數組。如果你的下一個原語不使用法線,這可能會有後果。

因此,它被認爲是一個很好的做法,當一個原始的圖紙做是爲了恢復了OpenGL狀態。也就是說,如果所有基元都使用您啓用的所有陣列,則可以將它們啓用,就像在應用程序運行的整個過程中啓用GL_TEXTURE_2D一樣。這是因爲我知道我會經常使用的紋理,然後沒有理由啓用/中的每個對象的繪製調用禁用它;這隻會降低應用程序的性能。

+0

像紋理座標。指針被啓用,但是還有另外一行來設置實際數組:'glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);'。所以我可以將它從網格物體放到網格物體上,只要我將其更新到不同的緩衝區中? – Tenfour04

+0

@ TenFour04:是的。 – Wroclai

2

glEnableClientState(GL_VERTEX_ARRAY)

如果聲明類似上面,它使的OpenGL從頂點數組使用頂點

否則的OpenGL不知道它用來展示的頂點,所以什麼陣列它不會顯示任何東西