Ваши два варианта здесь имеют компромисс: предоставьте дважды геометрию один раз и интерполируйте между ней, или предоставьте только один набор геометрии, но сделайте это для каждого кадра. Вы должны взвесить размер геометрии и ширину полосы загрузки.
Учитывая мой опыт работы с устройствами iOS, я настоятельно рекомендую вариант 1. Загрузка новой геометрии на каждый кадр может быть чрезвычайно дорогой на этих устройствах.
Если вершины постоянны, вы можете загрузить их один раз в один или два объекта буфера вершин (VBO) с установленным флагом GL_STATIC_DRAW
. Серия PowerVR SGX имеет аппаратную оптимизацию для работы со статическими VBO, поэтому с ними очень быстро работать после начальной загрузки.
Что касается загрузки двух наборов вершин для использования в одном шейдере, геометрия - это просто еще один входной атрибут для вашего шейдера. Вы можете иметь один, два или более наборов вершин, подаваемых в один вершинный шейдер. Вы просто определяете атрибуты, используя код как
attribute vec3 startingPosition;
attribute vec3 endingPosition;
и интерполировать между ними, используя код, подобный
vec3 finalPosition = startingPosition * (1.0 - fractionalProgress) + endingPosition * fractionalProgress;
Редактировать: Томми указывает на операцию mix()
, о которой я забыл, и это лучший способ выполнить вышеупомянутую интерполяцию вершин.
Чтобы проинформировать вашу шейдерную программу о том, где взять второй набор вершин, вы должны использовать почти такой же glVertexAttribPointer()
вызов второго набора геометрии, как первый, только указывая на этот VBO и атрибут .
Обратите внимание, что вы можете выполнять это вычисление как вектор, а не разбивать все три компонента по отдельности. Это не очень хорошо с точностью по умолчанию highp
на современных чипах PowerVR SGX, но может быть быстрее на будущих, чем делать этот компонент за раз.
Возможно, вы также захотите изучить другие методы, используемые для скинирования вершин, потому что могут быть другие способы анимации вершин, для которых не требуется загружать два полных набора вершин.
Единственный случай, когда я слышал, что вариант 2 (загрузка новой геометрии в каждом кадре) может быть предпочтительным, - это особые случаи, когда использование фреймворка Accelerate для векторной манипуляции с геометрией оказывается быстрее, чем выполнение скининга на -gpu. Я помню, что люди Unity говорили об этом однажды, но я не могу вспомнить, было ли это для действительно маленьких или действительно больших наборов геометрии. Вариант 1 был быстрее во всех случаях, когда я работал сам с собой.