понедельник, 21 ноября 2011 г.

Рендеринг с использованием VBO и шейдеров.


Решил на днях опробовать сабж в GLScene. Благо под рукой есть пару реализаций. Пошел пока я следующим путем...
Для начала было продумано несколько стилей рендеринга объектов:
  • Повершинное освещение с текстурированием (0-4 источника света).
  • Повершинное освещение с текстурированием и картой раскраски (0-4 источника света). 
  • Попиксельное освещение с бампом и спекуляром (0-4 источника света).
  • Попиксельное освещение с бампом, спекуляром и картой раскраски (0-4 источника света).
Потом можно будет немного поиграться с комбинациями и добавить еще опционально освещение от направленного источника света. Под картой раскраски подразумевается простая RGB текстура весов, по которой соответствующие части модели будут тонированы каким-либо цветом. По идее штука полезная, позволит несколько разнообразить сцену.

В GLScene статические и анимированные модели хранят в себе свою геометрию, и чтобы не дублировать данные, приходится пользоваться прокси-объектами. На данный момент я реализовал библиотеку моделей, которая держит ссылки на несколько библиотек материалов (просто чтобы дергать оттуда хэндлы текстур, настройки материалов не учитываются), а также содержит список моделей. Структура моделей позаимствована от TGLBaseMesh с его TMeshObject и TFaceGroup классами. Каждой моделе устанавливается стиль рендеринга, на основе которого определяются применяемые шейдеры. Каждая модель из библиотеки имеет метод рендеринга, который вызывается из непосредственно "рендерера", в роли которого выступает наследник от TGLBaseSceneObject, которому дается ссылка на библиотеку моделей и имя требуемой модели. Таким образом достигается возможность размещения отображаемой модели в пространстве, ее шкалирование, вращение. Так же отбрасывается понятие прокси объекта за ненадобностью. На мой взгляд, это достаточно простое и логичное решение.


Пока я не знаю оставлять ли данные о вершинах, нормалях, текст. координатах в оперативной памяти после их загрузки в видеопамять. Быть может, стоит выгружать из видеопамяти давно неиспользованную геометрию и загружать ее снова по мере необходимости, хотя по сравнению с текстурами, она занимает не так много памяти.

Когда я начал делать шейдеры для различных стилей рендеринга я столкнулся со следующей ситуацией (я про нее знал, но до этого не сталкивался). Да, в шейдерах можно использовать циклы и они более-менее нормально работают, но до того момента пока граница цикла обозначена константой. При попытке установки границы через uniform - переменную возникает ошибка, которая так и говорит, что такой цикл недопустим. Поэтому, по ходу, для каждого из стилей рендеринга придется писать по 5 вариантов шейдеров : 0-4 источника света.

В общем, тема достаточно интересная (особенно, когда под рукой есть примеры и все получается, ага) и влечет за собой такие детали как рендеринг водных поверхностей, являющейся частью модели (фонтан, например), hook point'ы модели (для прицепления эффектов или, например дверей), разработка непосредственно хорошего, годного формата модели и импортера\экспортера.

З.Ы. VBO, действительно, дает неплохие результаты.

6 комментариев:

  1. С таким перелопачиванием сцены проще от нее уйти :)

    имха, конечно же :)

    ОтветитьУдалить
  2. Я было дело посматривал в сторону C# уже. Там и фреймворк есть (Tao) и ООП дружественный, на дельфийский похож, если можно так сказать. Но пока на GLScene останусь.

    ОтветитьУдалить
  3. Я могу ошибаться, но Tao framework есть ни что иное, как ООП-обертка над openGL, glut и какими-то другими gl-библиотеками (всех не помню). Так что единственное преимущество - язык C#.

    Уж проще смотреть в сторону Х-НИ. :)

    ОтветитьУдалить
  4. Ну, там еще что-то типа нашего SceneViewer'а есть. ODE, Cg, еще что-то. При желании, думаю, разобраться можно.

    ОтветитьУдалить
  5. https://glscene.svn.sourceforge.net/svnroot/glscene/branches/GLScene_1_2_0
    YarUnderoaker проделал огромную работу для этой ветки, написал абстрактный рендер который позволяет работать на разных уровнях API. Примитивы сцены там переписаны под новый рендер, можно спокойно использовать VBO, если посмотреть организацию их классов.

    ОтветитьУдалить
  6. Serg de Adelantado, это, как я понимаю, заготовка под следующую версию или же параллельный проект будет?

    ОтветитьУдалить