Мне нужно нарисовать много полигонов, состоящих из 6 вершин (два треугольника).
Без каких-либо текстурных координат, нормалей и т. Д. Оба подхода дают 72 байта. В будущем мне, безусловно, понадобятся координаты текстур и нормали, из-за которых индексное рисование будет занимать меньше памяти. Не много, хотя.
Итак, мой вопрос: для ВАО с небольшим перекрытием вершин, какой подход быстрее? Меня не волнует дополнительная память, потребляемая неиндексным рисованием, только скорость.
Изменить: чтобы было понятно.
Неиндексный подход:
float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,
//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};
Индексный подход:
float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};
int[6] indices = {
//Triangle 1
0,1,2,
//Triangle 2
0,3,2
};
Ответы:
Я пытаюсь ответить на вопрос. Я думаю, что вы должны идти с индексами по нескольким причинам:
1) В любом случае, индексирование является бесплатной операцией на стороне GPU, вы не берете штрафы там. (добавлено) Конечно, индексы являются операциями произвольного доступа и могут снизить производительность кэша памяти GPU.
2) Индексирование может позволить кеш вершин графического процессора выполнять те немногие оптимизации для перекрывающихся вершин.
3) Меньший объем памяти на стороне графического процессора много раз означает лучшую производительность, поскольку пропускная способность памяти является одним из узких мест, а также потому, что операции извлечения (например, 10_10_10_2 -> 4 x float) во многих случаях не требуют затрат.
Разница в скорости, вероятно, не заметна, если не много перекрывающихся вершин, где вы можете получить улучшение скорости. Но у меня действительно нет никаких веских фактов, чтобы поддержать мое мнение (чтобы пойти с индексами).
Смотрите также это:
/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate
источник
Если позиции всегда одинаковы, вы даже можете обойтись без каких-либо буферов, сохранив массив в шейдере и используя
gl_VertexID
для выбора вершины в вершинном шейдере.источник
как и во всех вещах, связанных с производительностью, не угадайте, профилируйте это, чтобы узнать.
это будет варьироваться в зависимости от аппаратного обеспечения и очень многих сложных факторов. измерение с помощью профилирования автоматически рассмотрит все эти вещи для вас без необходимости что-либо знать о них.
источник
Я предполагаю, что использование индексации для вершин будет медленнее.
Я неправильно понял исходный вопрос, но вот ответ для цветовой индексации. Я предполагаю, что те же правила будут применяться для индексации вершин (без потери точности), но это всего лишь предположение.
Но...
72 байта настолько малы, что, вероятно, было бы недостаточно эффективно использовать память, чтобы не индексировать их.
Несколько практических правил: индексирование более эффективно использует память. Индексирование теряет цветовую точность. Не индексируется быстрее.
Это может привести к тому, что вы захотите никогда не использовать индексирование, но компромисс с памятью весьма важен для изображений приличного размера. Точность цвета незаметна.
Индекс работает так, что когда он рисует пиксель, ему присваивается индекс, и он должен искать цвет в таблице заранее определенного размера. (Допустим, 256 байтов, поэтому вы ограничены 256 цветами). Затем он рисует этот пиксель. При индексировании данные пикселей не хранятся напрямую, поэтому нет ограничения по цвету 256. Но в изображении размером 100x100 ваше 400-байтовое изображение теперь составляет 10000 байтов.
Отказ от ответственности, я вытаскиваю эти цифры из своей шляпы.
источник