gl_VertexID в неиндексированном рендеринге - PullRequest
0 голосов
/ 21 февраля 2019

На странице OpenGL gl_VertexID четко указано:

gl_VertexID - это входная переменная языка вершин, которая содержит целочисленный индекс для вершины

, в то время какна странице OpenGL Vertex Shader говорится, что это

индекс обрабатываемой в данный момент вершины.При использовании неиндексированного рендеринга это эффективный индекс текущей вершины (количество обработанных вершин + первое значение).

Могу ли я предположить 100%, что в неиндексированных командах рендерингаgl_VertexID - это индекс вершины int в буфере связанных вершин?или это скорее индекс вершины, обрабатываемой командой рендеринга (которая может или не может следовать порядку в буфере вершин)

Сомнение возникает из части описания внутри (), как для количество обработанных вершин , равное индексу текущей вершины в буфере вершин, вершины должны обрабатываться линейно.Могу ли я предположить, что так будет всегда?Или, может быть, есть реализации OpenGL, которые обрабатывают вершины в обратном направлении, или в контейнерах и т. Д.

1 Ответ

0 голосов
/ 21 февраля 2019

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 будет индексом вершины, заданным вашей примитивной последовательностью…

...