Архитектура рендера - 2
Автор: MiF
Не претендую на 100% истину, но вариант реализован и работает.
Итак главные игроки:
1. Renderer - низкоуровневый wrapper над 3d API. При всей своей низкоуровневости умеет работать с некоторыми высокоуровневыми объектами (создавать и биндить VertexBuffer, IndexBuffer, Texture, RenderTarget и т.д.) Дальше рендера вызовы 3d API не происходят.
2. RenderManager - менеджер среднего звена. Получает высокоуровневые объекты рендера от наивысшего уровня, сортирует по буферам/материалам и рендерит на первом уровне.
3. Scene - наивысший уровень, с ним работает юзер. Содержит все объекты сцены, разбиения пространства. Умеет отсекать невидимую геометрию и слать объекты на render render manager'у.
Теперь подробнее:
1. Уровень сцены.
a. I3DObject.
Интерфейс любого 3д-объекта, содержит трансформации. Все иерархично.
b. IRenderableObject : public I3DObject
Базовый класс для любого выводимого объекта. Содержит все, что нужно для вывода объекта с точки зрения рендера, а именно - Mesh + Material
Mesh - геометрия, содержит вершинный и индексный буфер, методы доуступа к данным
Material - все остальное (все что нужно для рендера, но не геометрия, например - шейдер, текстуры), в том числе может содержать ссылки на Viewport'ы
c. Viewport = Camera + RenderTarget + RenderingParameters, инкапсулирует проход рендеринга (без информации об объектах прохода), дабы вынести все это из материала наружу и хранить в сцене.
RenderingParameters - инкапсулирует стейты, вроде писать ли в depth, color, нужен ли свет, тени, текстурирование и т.д.
У сцены есть MainViewport - главный Viewport рендеринга
Как происходит рендеринг на уровне сцены:
1. Для MainViewport определяется список всех видимых объектов
2. По списку всех видимых объектов формируется список видимых материалов, по нему - список видимых вьюпортов.
3. Для каждого вьюпорта также определяется список видимых объектов (здесь по желанию можно вернутся к пункту 2, если захочется сделать, например, бесконечные отражения между противоположно стоящими зеркалами), список статических объектов для неподвижных вьюпортов может быть заранее обсчитан
Таким образом мы знаем список всех выводимых объектов для каждого вьюпорта. Шлем это RenderManager'у (Viewport'ы упорядочены по приоритету использования, то есть главный рендерится только когда все остальное готово)
На уровне RenderManager:
Все просто - сортируем в пределах каждого вьюпорта геометрию (пришедшие от сцены IRenderableObject'ы) по мешам и материалам и рендерим с помощью Renderer'а.
Направления текущего развития:
1. Материал наполняется техниками в run-time, расширение возможностей (добавление новых эффектов) рендера происходит путем добавления новых техник, которые можно комбинировать.
2. Возможность добавление в сцену своих разбиений пространств (или комбинаций), код сцены само собой при этом не меняется.
Система сейчас довольно сырая, но перспективная :) Жду критики и вариантов модификации.
9 января 2006
Комментарии [4]