Почему glBeginTransformFeedback требует указания примитивного типа?

#opengl #transform-feedback

#opengl #преобразование-обратная связь

Вопрос:

Я пытался подумать, зачем OpenGL нужно знать примитивный тип при вызове glBeginTransformFeedback. По сути, это просто данные, которые хранятся в буфере.

Я предполагаю, что OpenGL каким-то образом нуждается в этом, чтобы вычислить, сколько места требуется, чтобы команды рисования могли выполняться параллельно, не перегружая данные друг друга. Но когда вы отправляете команду рисования, OpenGL должен иметь возможность определять требуемое пространство из примитивного типа, указанного в чертеже.

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

Итак, как я понимаю, указание примитивного типа glBeginTransformFeedback просто накладывает ограничение на тип примитивов, которые вы можете отображать. Почему это ограничение?

Ответ №1:

Окончательный ответ на ваш вопрос: «потому что так сказано в спецификации». Причины этого не объясняются в спецификации. Но в расширениях, где изначально была введена обратная связь с преобразованием, NV_transform_feedback и EXT_transform_feedback , вы найдете следующее в разделах проблем:

  1. Почему только один режим примитива обратной связи для каждого вызова обратной связи?

    РЕШЕНО: наличие примитивных токенов разбивает поток и делает его менее пригодным для повторного чтения в качестве вершинного буфера. Кроме того, смешивание нескольких примитивных типов делает подсчет примитивов менее понятным для приложения.

На самом деле нет никакой серьезной технической причины, это просто выбор дизайна, который они сделали в какой-то момент.

Ответ №2:

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

Если команда рисования указывает треугольники, но программа выдает точки, которые программист ожидает сохранить? Указание примитивного типа с помощью glBeginTransformFeedback позволяет проверять, прежде чем рисовать что-либо.

Обратная связь преобразования может работать, сохраняя все, что программа выдает, как вы предлагаете, и это может быть даже предпочтительнее в некоторых случаях, но тогда потребуется какой-то механизм запроса «какой тип геометрии находится в буфере обратной связи?» впоследствии.

Комментарии:

1. «Если команда рисования указывает треугольники, но программа выдает точки, которые программист ожидает сохранить?» Согласно спецификации, фиксируется, что программа выводит в этом случае (и это также то, против чего проверяется примитивный тип, заданный BeginTransformFeedback тогда), и программист, ожидающий чего-то другого, кроме того, что указано в спецификации, все равно ошибается.