Есть ли еще преимущества использования gl_quads?

10

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

Теперь я слышал, что игра должна быть написана с использованием треугольников. Но мне интересно, если из-за специфики того, как OpenGL превращает этот четырехугольник в два треугольника, всегда ли выгодно использовать четырехугольники?

В частности, в настоящее время я рендерил много несвязанных четырехугольников из довольно больших буферных объектов. Одна из областей, которую я должен быть осторожным, - насколько велик вектор, который я использую для создания / обновления этих объектов буфера с плавающей точкой (у меня довольно много дополнительных значений с плавающей точкой на вершину и много вершин в буфере - самые большие буферы - около 500 КБ).

Поэтому меня удивляет, что если я изменю свои буферные объекты, чтобы нарисовать треугольники, эти данные вершин будут на 50% больше (шесть вершин, чтобы нарисовать квадрат, а не 4), и процессор будет генерироваться на 50% дольше.

Если gl_quads все еще работает, я получаю здесь преимущество, или 50% дополнительной памяти и процессорного времени все еще используются для автоматического преобразования OpenGL в два треугольника?

user27018
источник
5
Я уверен, что OpenGL поддерживает какой-то индексированный буфер вершин, то есть вы сохраняете только те же 4 вершины для четырехугольника, и вместо того, чтобы повторять целые вершины, чтобы сделать два треугольника, вы только повторяете индексы: [0,1,2] , [2,3,0]
Отличный ответ здесь
бобобо
Я полагаю, что спецификация GL все еще предусматривает некоторые случаи, когда рисование в виде квадрата имеет значение, например, с glPolygonMode (..., GL_LINE).
Максимус Минимус

Ответы:

5

Проверьте свою настоящую игру. Если квады быстрее, используйте их. Если нет, не надо.

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

Короче, тест. Не принимайте и не просите в Интернете совета по производительности. Иногда мы можем быть правы, но чаще мы будем либо предоставлять вам устаревшие данные, либо данные, основанные на каких-то конкретных обстоятельствах, в которых вы не находитесь, либо откровенный мусор, который мы сами приобрели из Интернета или у коллег (которые сами могут этого не делать). опыт из первых рук).

Шон Миддледич
источник
3

Какие есть альтернативы? Хорошо, одна альтернатива - использовать геометрические шейдеры , передавая GL_LINES_ADJACENCYпримитив (4 вершины) и заставляя GS преобразовать этот примитив в треугольную полосу. Тем не менее, это будет медленнее , чтобы сделать, потому что один должен предположить , геометрия шейдеров всегда медленнее для визуализации.

Лучший способ - использовать индексированный рендеринг. Здесь у вас есть две альтернативы: GL_TRIANGLESи GL_TRIANGLE_STRIPс примитивным перезапуском. Последнее приведет к немного более короткому индексному буферу (один индекс для каждого четырехугольника). Вы можете повторно использовать один и тот же индексный буфер для любого четырехъядерного рендеринга, поэтому вам не нужно будет обновлять или модифицировать индексный буфер.

Я бы также предложил использовать шорты без знака в качестве типа индекса. Если вам нужно визуализировать более 16384 квадов одновременно, сделайте несколько вызовов рендеринга, используя glDrawElementsBaseVertex для смещения индексов.

Николь Болас
источник
Некоторые недавние сравнительные тесты, которые я сделал, показывают, что glMultiDrawArrays теперь является быстрым способом как для NV, так и для AMD (не беспокоил Intel), поэтому есть еще один вариант - glMultiDrawArrays с веером или полосой.
Максимус Минимус
@ mh01: для этого требуется клиентский массив команд рисования. Вы должны были glMultiDrawArraysIndirectбы сделать это на стороне GPU. Что вы можете сделать, но это ограничивает аппаратное обеспечение.
Николь Болас