С VBO у вас, как правило, есть два основных преимущества.
Преимущество 1 относится к полностью статическим данным и связано с возможностью сохранять ваши данные вершин в памяти, которая является более оптимальной для графического процессора.
Преимущество 2 относится к динамическим данным и заключается в возможности указать данные вершин в любой момент времени до их использования для рендеринга, что может улучшить конвейеризацию.
Третье преимущество заключается в пакетной обработке вызовов вызовов, но оно также используется в массивах вершин старой школы, поэтому я не буду называть это специально для VBO. Отправка данных в графический процессор (или использование данных, уже находящихся в графическом процессоре) во многом аналогична дисковому вводу-выводу и сетевому трафику - если у вас есть несколько больших пакетов, это более эффективно, чем множество небольших пакетов.
Хорошая (не на 100% точная, но достаточная, чтобы помочь вам разобраться в этом) аналогия заключается в том, что вы водитель автобуса, который должен доставить 50 человек из одного города в другой. Вы можете загрузить их по одному и совершить 50 отдельных поездок - это glBegin / glEnd. В качестве альтернативы вы можете поместить все 50 из них в автобус и просто совершить одну поездку - это пакетирование с массивами вершин или VBO (в случае VBO 50 человек уже будут в автобусе;)).
Это происходит за определенную цену, и здесь цена заключается в том, что вы теряете возможность просто указывать данные вершины, как и когда вам это нужно. Хорошо, хорошо, вы можете сделать это (с некоторой дополнительной работой), но вы не получите полную производительность от своего кода. Вместо этого вам нужно больше думать о данных вершин, о том, как они используются, как (и если) их нужно обновлять, можно ли делать какие-либо анимации в шейдере (таким образом, чтобы данные оставались статичными - VBO действительно нужны шейдеры для много случаев анимации, чтобы работать хорошо) или вам нужно переопределять данные вершин в каждом кадре, эффективные стратегии обновления, если последний, и т. д. Если вы этого не сделаете и просто осуществите наивное преобразование, у вас очень высокий риск размещения в большой работе только для конечного результата на самом деле работать медленнее!
Когда вы впервые сталкиваетесь с этим, это может показаться ужасной работой, но на самом деле это не так. Как только вы войдете в такой образ мышления, вы обнаружите, что это невероятно легко и почти естественно. Но вы можете испортить свои первые несколько попыток, и вам не следует расстраиваться, если это так - провал - это возможность узнать из того, что вы сделали неправильно.
Несколько заключительных мыслей.
Наличие данных модели в формате, который можно легко загрузить в VBO, может значительно облегчить вам весь этот процесс. Это означает, что вам следует избегать более сложных или экзотических форматов, по крайней мере, сначала (и до тех пор, пока вы не освоитесь с процессом); Сохраняйте вещи простыми и простыми, насколько это возможно, при обучении, и будет меньше вещей, которые могут пойти не так, и меньше мест, где придется искать ошибки, если (или когда!) что-то пойдет не так.
Людей иногда отталкивают, если они видят реализацию VBO, использующую больше памяти, чем оптимизированная / сжатая реализация glBegin / glEnd (они могут даже называть это «отходами»). Не будь таким. За исключением крайних случаев, использование памяти действительно не что важно. Здесь очевидный компромисс - вы принимаете потенциально более высокое использование памяти в обмен на существенно более высокую производительность. Также помогает развить мышление, что память - это дешевый и обильный ресурс, который нужно использовать; производительность нет.
И, наконец, старый каштан - если он уже достаточно быстр, значит, ваша работа выполнена. Если вы достигли целевой частоты кадров, если у вас есть запас для переходных условий, то этого достаточно, и вы можете перейти к следующему шагу. Вы можете тратить много времени и энергии, выжимая лишние 10% из чего-то, что на самом деле в этом не нуждается (был там, сделал это, все еще попал в ловушку), поэтому всегда учитывайте, как наиболее оптимально использовать ваше собственное время. Потому что время программиста еще дешевле и менее затратно, чем производительность!