高級話題
OpenGL 3.1(尤其是GLSL 1.40)增加了對實例化繪製的支持,它提供了另一個額外的值gl_InstanceID(叫做實例ID,並且它只在頂點着色器中可用),對於指定的每一組圖元,該ID相應遞增。
glDrawArraysInstanced()的運行和glMultiDrawArrays()類似,只不過對於glDrawArrays()的每次調用,開始索引和頂點計數是相同的(分別由first和count指定)。
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
primcount次有效地調用glDrawArrays(),在每次調用前設置GLSL頂點着色器值gl_InstanceID。mode指定了圖元類型。first和count指定了傳遞給glDrawArrays()的數組元素的範圍。
glDrawArraysInstanced()和如下的連續調用具有相同的效果(只不過我們的應用程序不必手動更新gl_InstanceID):
- for (i = 0; i < primcount; i++) {
- gl_InstanceID = i;
- glDrawArrays(mode, first, count);
- }
- gl_InstanceID = 0;
同樣,glDrawElementsInstanced()執行同樣的操作,但是允許隨機訪問頂點數組中的數據。
- void glDrawElementsInstanced(GLenum mode, GLsizei count,
- GLenum type, const void *indicies,
- GLsizei primcount);
primcount次有效地調用glDrawElements(),在每次調用前設置GLSL頂點着色器值gl_InstanceID。mode指定了圖元類型。type指定了數組索引的數據類型,並且必須是如下之一:GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或GL_UNSIGNED_INT。indicies和count指定了傳遞給glDrawElements()的數組元素的範圍。
glDrawElementsInstanced()的實現如下所示:
- for (i = 0; i < primcount; i++) {
- gl_InstanceID = i;
- glDrawElements(mode, count, type, indicies);
- }
- gl_InstanceID = 0;