Преобразование обратной связи потеряло порядок треугольной сетки

Я пытаюсь вычислить некоторые из моих вершин в вершинном (или геометрическом) шейдере. Когда я наконец нарисовал вершины, они потеряли порядок, который я дал объекту массива вершин (с GL_ELEMENT_ARRAY_BUFFER). Функция glDrawElements не работает в этой ситуации, вместо этого я должен использовать glDrawArrays. Я ошибся?

Как я могу сохранить порядок индекса треугольников для обратной связи преобразования?

1 ответ

Вы не ошиблись. Вершины записываются в буфер обратной связи преобразования в порядке их обработки вершинным (или геометрическим) шейдером. Я не вижу простого способа обойти это.

Это означает, что если вы хотите нарисовать вершины в захваченном буфере, вы будете использовать 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 переставить вершины, снова запустив вывод через обратную связь преобразования и используя индексный массив, который является обратным отображением исходного индексного массива.

В любом случае это выглядит неловко. Возможно, вы захотите еще раз продумать свой вариант использования и убедиться, что вам действительно нужны вершины в исходном порядке.

Отказ от ответственности: я никогда не использовал обратную связь с преобразованием, и проделал очень минимальную работу по ее внедрению / исправлению в драйверах. Все вышеперечисленное - мое понимание чтения спецификации.

Другие вопросы по тегам