2.6.5 實例化繪製glDrawArraysInstanced()

高級話題

OpenGL 3.1(尤其是GLSL 1.40)增加了對實例化繪製的支持,它提供了另一個額外的值gl_InstanceID(叫做實例ID,並且它只在頂點着色器中可用),對於指定的每一組圖元,該ID相應遞增。

glDrawArraysInstanced()的運行和glMultiDrawArrays()類似,只不過對於glDrawArrays()的每次調用,開始索引和頂點計數是相同的(分別由first和count指定)。

  1. void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count,  GLsizei primcount); 

primcount次有效地調用glDrawArrays(),在每次調用前設置GLSL頂點着色器值gl_InstanceID。mode指定了圖元類型。first和count指定了傳遞給glDrawArrays()的數組元素的範圍。

glDrawArraysInstanced()和如下的連續調用具有相同的效果(只不過我們的應用程序不必手動更新gl_InstanceID):

  1. for (i = 0; i < primcount; i++) {  
  2. gl_InstanceID = i;  
  3. glDrawArrays(mode, first, count);  
  4. }  
  5. gl_InstanceID = 0

同樣,glDrawElementsInstanced()執行同樣的操作,但是允許隨機訪問頂點數組中的數據。

  1. void glDrawElementsInstanced(GLenum mode, GLsizei count,  
  2. GLenum type, const void *indicies,  
  3. GLsizei primcount); 

primcount次有效地調用glDrawElements(),在每次調用前設置GLSL頂點着色器值gl_InstanceID。mode指定了圖元類型。type指定了數組索引的數據類型,並且必須是如下之一:GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或GL_UNSIGNED_INT。indicies和count指定了傳遞給glDrawElements()的數組元素的範圍。

glDrawElementsInstanced()的實現如下所示:

  1. for (i = 0; i < primcount; i++) {  
  2. gl_InstanceID = i;  
  3. glDrawElements(mode, count, type, indicies);  
  4. }  
  5. gl_InstanceID = 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章