Я хочу сделать свой VBO-движок, и мне было интересно, нужно ли обновлять все VBO с обновленными значениями с помощью glBufferSubData
или просто использовать устаревший glTranslatef
для перемещения моей вещи.
И если бы я просто обновил значения в VBO, должен ли я использовать отдельный VBO для координат вершин, нормалей и текстур, или я должен поместить их все в один?
Благодарю.
1: Обычно вы всегда должны стараться сократить объем данных, передаваемых между CPU и GPU, до минимума, чтобы поддерживать максимальную производительность.
Таким образом, следует избегать обновления всего вершинного буфера с помощью glBufferSubData() и как можно дольше, и следует использовать такие преобразования, как glTranslate() и glLoadMatrix() (которые устарели) или шейдеры.
Но поскольку вы уже работаете с VBOs, я бы рекомендовал использовать шейдеры для преобразования с использованием равномерной переменной шейдера и glUniformMatrix().
2: Разделение вершин, нормалей и текстурных координат или объединение их в один VBO зависит от вас. В большинстве случаев я их объединяю, потому что он создает только один дескриптор, и мне нужен только один вызов glBufferData(). Но если есть ситуация, когда обновляется только одна часть, такая как координаты текстуры, а остальная часть остается такой, какая она есть, тогда разделение будет лучше, так как вы также можете обновить их отдельно.
Еще более продвинутый: если вы используете переплетение буфера, вы, очевидно, должны их комбинировать. Иногда использование переплетения буфера может быть быстрее, чем без, потому что данные, необходимые для одной вершины, хранятся вместе, и кеши могут использоваться. Но вы должны попробовать, какое влияние это оказывает на производительность (если есть), поскольку это сильно зависит от используемого вами оборудования.
glBufferSubData
так как они мне все равно понадобятся. Также разделение VBO, вероятно, является лучшей идеей, поскольку иногда требуется обновление только вершин или координат текстуры.