Существует два способа создания собственного Mesh-объекта:
- Создать Ogre::Mesh и предоставить ему напрямую vaoManager.
- Высокоуровневый интерфейс Ogre::ManualObject. Где вы просто вызываете функции "position" и "colour".
Обычно, при создание объектов геометрии вручную, требуется обратиться к низкоуровневым функциям API, поработать с буфером вершин и т.д, но класс ManualObject предоставит вам более простой и быстрый вариант создания 3D-объектов, с ним и будем работать.
Данный класс довольно сильно напоминает OpenGL immediate-mode (мгновенный режим, также известен как фиксированный конвейер Fixed Function Pipeline), просто потому что это более предпочитаемый стиль обществом.
Но, всё же, есть несколько различий:
- Внутри класса создаются Hardware буферы, которые могут потом быть повторно использованы, то есть вы можете отрисовывать результирующий объект множество раз, не повторяя все те же команды (функции) снова.
- Рендеринг не является немедленным (immediate). Всё проходит через очередь, как и все объекты OGRE. Что делает данный объект более эффективным, чем эквивалентные команды (функции) в OpenGL. Следовательно, данный класс можно использовать для больших объектов.
Этапы создания какой-либо геометрии:
- Если, примерно, знаете сколько вершин/индексов вы собираетесь отправить, вызовите estimateVertexCount() и estimateIndexCount(). Это не столь и критично, но повысит эффективность за счет экономии на перераспределение памяти.
- Вызовите begin(), чтобы начать ввод данных.
- Для каждой вершины, вызовите функции position(), normal(), textureCoord(), colour(), чтобы задать нужные параметры. Обратите внимание, что каждый раз, когда вызываете position(), вы начинаете новую вершину. Первая вершина определит компоненты для всех вершин - вы не можете добавить что-то новое после. К примеру, если вы не вызывали normal() в первой вершине, вы не можете вызвать данную функцию в других вершинах. Вы должны вызывать одну и ту же комбинацию для всех.
- Если вы хотите проиндексировать ваш список вершин, то используйте вызов index() столько раз, сколько нужно. Если этого не сделать, то класс будет считать, что вы хотите рисовать неиндексированной геометрией. Обратите внимание, что stencil shadows поддерживаются только в индексированной геометрии, и что индексированная геометрия быстрее работает; старайтесь использовать её всегда.
- Вызовите end(), чтобы завершить ввод данных.
- При необходимости повторить цикл begin-end. Как и любой другой объект MovableObject, вы должны прикрепить его к SceneNode, чтобы сделать видимым. Другие аспекты, такие как относительный порядок визуализации, можно контролировать с помощью стандартных методов MovableObject, таких как setRenderQueueGroup.
Вы также можете изменять геометрию объекта используя beginUpdate(). После изменений необходимо вызвать setDynamic(true) перед вызовом begin(), а также не забыть про использование estimateVertexCount() / estimateIndexCount(), чтобы избежать пересоздания буфера при росте геометрии.
В OGRE треугольники определяются против часовой стрелки.
Пример
Используя ManualObject создадим плоскость с текстурой.
Далее определим вершины для плоскости.
Теперь определим грани. OGRE сам разделит квадраты на треугольники для нас.
Вызов end() создаёт Hardware буфер, который будет использоваться для рендринга. Теперь можно прицепить объект к Ogre::SceneNode.
Прошлые записи:
Буду благодарен за любую поддержку каналу:
https://money.yandex.ru/to/4100110976771904