Как использовать шейдеры в OpenGL ES с iPhone SDK - PullRequest
3 голосов
/ 04 июля 2010

У меня есть эта одержимость делать анимацию персонажей в реальном времени, основанную на обратной кинематике и морфинге.

Я справился с Animata, программой с открытым исходным кодом (основанной на FLTK, к сожалению) анимационной программы в стиле IK-цепочки. Я даже портировал их код рендеринга на различные платформы (Java / Processing и iPhone) alt video http://ats.vimeo.com/612/732/61273232_100.jpg видео рендереров Animata

Однако я никогда не был убежден, что их код особенно оптимизирован, и кажется, что для рендеринга каждого кадра требуется много симуляции на CPU, что мне кажется немного ненужным.

Сейчас я начинаю проект по созданию приложения для iPad, которое в значительной степени опирается на анимацию персонажей в реальном времени, и перелистывая документацию по iOS, я обнаружил фрагмент кода для «шейдера с двумя костями»

// A vertex shader that efficiently implements two bone skinning.

attribute vec4 a_position;
attribute float a_joint1, a_joint2;
attribute float a_weight1, a_weight2;

uniform mat4 u_skinningMatrix[JOINT_COUNT];
uniform mat4 u_modelViewProjectionMatrix;

void main(void)
{
    vec4 p0 = u_skinningMatrix[int(a_joint1)] * a_position;
    vec4 p1 = u_skinningMatrix[int(a_joint2)] * a_position;
    vec4 p = p0 * a_weight1 + p1 * a_weight2;
    gl_Position = u_modelViewProjectionMatrix * p;
}

Кто-нибудь знает, как бы я использовал такой фрагмент? Это представлено с очень небольшим контекстом. Я думаю, что это то, что мне нужно сделать, чтобы сделать анимацию на основе цепочки костей IK, которую я хочу делать, но на GPU.

1 Ответ

3 голосов
/ 07 августа 2010

Я провел много исследований и теперь чувствую, что почти понимаю, о чем все это.

Первый важный урок, который я усвоил, заключается в том, что OpenGL 1.1 сильно отличается от OpenGL 2.0. В версии 2.0 принцип, по-видимому, заключается в том, что массивы данных передаются в графический процессор, а шейдеры используются для рендеринга деталей. Это отличается от v1.1, где больше делается в обычном коде приложения с pushmatrix / popmatrix и различными встроенными командами рисования.

Отличная серия постов в блоге, представляющих новейшие подходы к OpenGL, доступна здесь: Блог Джо: введение в современный OpenGL

Вершинный шейдер, который я описал выше, представляет собой преобразование набора вершин. члены 'attribute' являются per-vertex, а элементы'iform 'являются общими для всех вершин.

Чтобы этот код работал, вы должны передать массив векторных позиций (исходные позиции, я думаю), соответствующие массивы соединений и весов (другие переменные атрибута), и этот шейдер переместит входные вершины в соответствии с их прикрепленными суставы.

Равномерные переменные относятся в первую очередь к предоставленному текстурному изображению, а матрица проекции, как мне кажется, связана с преобразованием мировой системы координат в нечто, более соответствующее конкретным требованиям.

Возвращаясь к разработке для iPhone, лучше всего создать шаблонный проект OpenGL ES и обратить внимание на два разных класса рендеринга. Один для более линейного и устаревшего OpenGL 1.1, а другой для OpenGL 2.0. Лично я выкидываю код GL1.1, учитывая, что он применяется в основном к старым устройствам iPhone, и поскольку я нацеливаюсь на iPad, он больше не актуален. Я могу добиться лучшей производительности с шейдерами на GPU, используя GL2.0.

...