tl; dr: да, gl_VertexID
всегда будет логическим индексом соответствующей вершины в последовательности примитивов, заданной вашим вызовом отрисовки (фактически, индекс, из которого в буфере вершин будут считываться данные вершин)).Он не зависит от способа или порядка, в котором вершины фактически обрабатываются (если бы он это делал, это сделало бы его довольно бесполезной функцией, поскольку это не обеспечивало бы надежного поведения вообще).
Из OpenGL4.6 спецификация (11.1.3.9 шейдерные входы):
gl_VertexID
содержит целочисленный индекс i , неявно переданный DrawArrays или одним издругие команды рисования, определенные в разделе 10.4.
и из 10.4:
Индекс любого элемента, переданного в GL с помощью DrawArraysOneInstance , называетсякак vertex ID
и может читаться вершинным шейдером как gl_VertexID
.vertex ID
переданного i -го элемента равно first + i .
и
Индекс любого элемента, переданного в GL DrawElementsOneInstance , называется его vertex ID
и может быть прочитан вершинным шейдером как gl_VertexID
.vertex ID
переданного i -го элемента является суммой basevertex и значения, хранящегося в текущем связанном буфере массива элементов со смещением индексов + i .
Теперь поведение всех неиндексированных вызовов отрисовки задается в терминах абстрактной команды DrawArraysOneInstance
.И поведение всех индексированных вызовов отрисовки определяется в терминах абстрактной команды DrawElementsOneInstance
.Не вдаваясь в какие-либо подробности (вы можете покопаться в разделе 10.4. Если вы хотите узнать больше), все вышеперечисленное в основном означает, что если вы рисуете с индексным буфером, то gl_VertexID
будет индексомвершина, указанная буфером индекса, и если вы рисуете без буфера индекса, gl_VertexID
будет индексом вершины, заданным вашей примитивной последовательностью…