Я пытаюсь вычислить некоторые из моих вершин в вершинном (или геометрическом) шейдере. Когда я наконец нарисовал вершины, они потеряли порядок, который я дал объекту массива вершин (с GL_ELEMENT_ARRAY_BUFFER). Функция glDrawElements не работает в этой ситуации, вместо этого я должен использовать glDrawArrays. Я ошибся?
Как я могу сохранить порядок индекса треугольников для обратной связи преобразования?
Вы не ошиблись. Вершины записываются в буфер обратной связи преобразования в порядке их обработки вершинным (или геометрическим) шейдером. Я не вижу простого способа обойти это.
Это означает, что если вы хотите нарисовать вершины в захваченном буфере, вы будете использовать glDrawArrays()
, Или в GL 4.0 и позже, вы также можете использовать glDrawTransformFeedback()
,
Если вы рисовали с индексами и нуждаетесь в вершинах в их первоначальном порядке, вам придется переставлять их самостоятельно. Если ваш индексный буфер был заполнен n
индексы из массива idxA
, ваш входной буфер с вершинами из массива inVertexA
и вершины из захваченного буфера находятся в массиве capturedVertexA
преобразованные вершины в исходном порядке могут быть записаны в outVertexA
как:
for (int k = 0; k < n; ++k) {
outVertexA[idxA[k]] = capturedVertexA[k];
}
Это будет работать до тех пор, пока рисунок был с примитивным типом GL_TRIANGLES
, Если бы вы рисовали с чем-то вроде GL_TRIANGLE_STRIP
логика индекса будет несколько более сложной, поскольку обратная связь преобразования создает отдельные треугольники.
Я думаю, вы могли бы позволить GPU переставить вершины, снова выполнив вывод через обратную связь преобразования и используя индексный массив, который является обратным отображением исходного индексного массива.
В любом случае это выглядит неловко. Возможно, вы захотите еще раз продумать свой вариант использования и убедиться, что вы действительно вершины нужно вернуть в исходном порядке.
Отказ от ответственности: я никогда не использовал обратную связь с преобразованием, и проделал очень минимальную работу по ее внедрению / исправлению в драйверах. Все вышеперечисленное — мое понимание чтения спецификации.