Есть ли явная разница в производительности между GL_QUADS и GL_TRIANGLE STRIP?

Итак, я искал оптимизации для своей программы и размышлял, является ли использование QUADS наиболее эффективным способом сделать это. Я использую сопоставленные чередующиеся VBO для QUADS и координаты TEXTURE.

Поэтому я хочу знать, есть ли явное повышение производительности при использовании одного из следующих вместо QUADS для рендеринга:

Примечание. Это должно включать тот факт, что я использую текстуры!

  • TRIANGLE_STRIPS
  • ТРЕУГОЛЬНИКИ
  • QUAD_STRIPS

Какой самый быстрый?

Примечание 2. Я огляделся и не нашел однозначного ответа.


person Amit Assaraf    schedule 02.06.2013    source источник
comment
Есть разница между TRIANGLE_STRIPS и TRIANGLES. Не уверен в QUAD_STRIPS, почему бы просто не создать небольшую программу, которая берет большое количество случайных примитивов, рисует их и смотрит на производительность.   -  person Xonar    schedule 02.06.2013
comment
Да, но я хочу знать, есть ли разница по сравнению с QUADS ... и это отличная идея сделать программу, но у меня просто нет времени, поэтому я хочу посмотреть, смогу ли я получить короткий и хороший ответ: D   -  person Amit Assaraf    schedule 02.06.2013
comment
stackoverflow.com/questions/6644099 /   -  person Grimmy    schedule 02.06.2013


Ответы (1)


  • GL_QUAD_STRIP устарел и не поддерживается в текущей версии OpenGL, поэтому его нет. Кроме того, это все равно не так быстро - см. этот пост, чтобы объяснение того, почему он больше не поддерживается (за исключением целей совместимости).

  • GL_TRIANGLES - вообще хороший вариант. Это будет быстрее, чем использовать устаревший функционал. И в принципе это быстрее - квадраты все равно разбиваются на треугольники, поэтому вы экономите кучу ненужной работы, выполняя ее только на стороне процессора, а затем сохраняя работу графического процессора, которую он должен был бы выполнять. Треугольники - это стандартный и прекрасный способ задания форм.

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

Если вам нужна лучшая производительность из трех, GL_TRIANGLE_STRIP - ваш лучший выбор. К сожалению, если ваши данные уже не указаны для использования в полосе треугольников, вам придется самостоятельно упорядочить свои вершины и запомнить, где разместить вырожденные треугольники. Хорошей отправной точкой являются карты высот (т.е. рельеф). Однако сначала оптимизация других частей вашего кода (например, определение того, нужно ли рисовать объект) может быть более эффективным использованием вашего времени. И я могу ошибаться, я не думаю, что использование текстуры должно влиять на ваш выбор спецификации вершин.

Изменить: вот пример того, как рендеринг квадрата выполняется с помощью GL_TRIANGLE_STRIP

Вершины: (0,0) (0,1) (1,0) (1,1)

Треугольник 1: (0,0) (0,1) (1,0) (1,1)

Треугольник 2: (0,0) (0,1) (1,0) (1,1)

person GraphicsMuncher    schedule 02.06.2013
comment
У меня есть много оптимизаций, отбраковка усеченных лиц и т.д .. Так что я ищу другие вещи, которые могут помочь .. - person Amit Assaraf; 02.06.2013
comment
Не могли бы вы привести мне пример того, как визуализировать TRIANGLE_STRIP в 3D как QUAD? Я не могу понять это правильно - person Amit Assaraf; 02.06.2013
comment
Что ты имеешь в виду под квадратом? - person GraphicsMuncher; 03.06.2013
comment
Визуализация 3D-квадрата с помощью треугольников - person Amit Assaraf; 03.06.2013
comment
Хотя это: GL_QUAD_STRIP устарело и не поддерживается в текущей версии OpenGL верно (по крайней мере, для основного контекста), это: Вам придется использовать glBegin и glEnd, чтобы использовать это особенность, конечно же, нет. Учитывая контекст совместимости (который вам и так нужен для устаревших вещей), никто не мешает вам смешивать устаревшие (например, GL_QUAD_STRIP) и нерекомендуемые (например, VBO). Хотя общий совет держаться подальше от устаревших вещей, конечно, хорош, это утверждение в его нынешнем виде совершенно неверно. По этой логике он должен был бы использовать glBegin/glEnd и для своего GL_QUADS. - person Christian Rau; 03.06.2013