2014-12-18 3 views
-1

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

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

ответ

0

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

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

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

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

+0

Благодарим за отзыв! Finnaly я использовал glDrawElements для прохода визуализации, и я связываю два разных обмена VBO для TF и ​​для того же VAO, чтобы получить эффект пинг-понга в VBO. Я не хочу менять вершины сетки, я хочу только сделать некоторые операции GPGPU для каждого треугольника. – alexGrac

Смежные вопросы