Я новичок в современном OpenGL. Я чувствую себя комфортно с непосредственной методологией OpenGL, но я никогда не делал серьезного использования VBO. Мой вопрос об анимации. В непосредственном режиме, чтобы добиться анимации, вам просто нужно передавать различные позиции вершин (интерполированные из ключевых кадров) в пространстве объектов.
Как это достигается в не-немедленном OpenGL? Очевидно, что загрузка свежих данных VBO для каждого кадра обязательно приведет к перегружению графической шины. Я не нашел никакой литературы о современном способе сделать это. Размышляя об этом, я пришел к нескольким вариантам:
- Атрибуты: анимация как 3D-смещение. Для каждого кадра передается различный (возможно интерполированный) атрибут смещения для каждой вершины, который применяется к одной и той же вершине каждого ключевого кадра.
- Индексы: хранение ключевых кадров в виде абсолютных вершин и доступ к ним посредством индексации с использованием различного набора вершин для каждого ключевого кадра. Я считаю такой подход невозможным, поскольку вы не можете получить доступ к смежным ключевым кадрам и, следовательно, не можете интерполировать их. Также кажется плохой идеей для процедурной анимации.
- Текстура: это может быть очень эластичным, но звучит как хорошее решение для меня. Опять же, анимация рассматривается как смещение XYZ для каждой вершины. Каждый ключевой кадр может храниться в одномерной текстуре, где измерение отображается на vertexID. Если я не ошибаюсь, в OpenGL 4.0 вы можете получить доступ к текстурам из любого шейдера, чтобы вы могли читать эту текстуру из вершинного шейдера и применять каждое преобразование вершин. 2D текстура может содержать несколько кадров. Вы по-прежнему выполняете интерполяцию (и если интерполяция работает для текстур вне фрагментного шейдера, в которых я не уверен, вы можете линейно интерполировать бесплатно!) Это можно применить к более сложным системам анимации, таким как анимация костей, без особых усилий.
Я обдумываю это? Кто-нибудь может пролить свет?