Вы не ошибаетесь. Вершины записываются в буфер обратной связи преобразования в том порядке, в котором они обрабатываются шейдером вершины (или геометрии). Я не вижу в этом легкого пути.
Это означает, что если вы хотите нарисовать вершины в захваченном буфере, вы будете использовать 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 перетасовывать вершины, снова запуская вывод через обратную связь и используя индексный массив, который является обратным отображением исходного массива индексов.
В любом случае это выглядит неловко. Вы можете снова подумать о своем прецеденте и убедиться, что у вас действительно нужны вереницы в первоначальном порядке.
Отказ от ответственности: Я никогда не использовал обратную связь преобразования и выполнял только очень минимальную работу по внедрению/исправлению ее в драйверах. Все вышеизложенное - это мое понимание от чтения спецификации.
Благодарим за отзыв! Finnaly я использовал glDrawElements для прохода визуализации, и я связываю два разных обмена VBO для TF и для того же VAO, чтобы получить эффект пинг-понга в VBO. Я не хочу менять вершины сетки, я хочу только сделать некоторые операции GPGPU для каждого треугольника. – alexGrac