Моя реализация E / C является базовой, где сущности - это просто идентификаторы, компоненты - данные, а системы работают с данными. Сейчас у меня проблемы с материалами объекта и рендерингом в целом. Для простых объектов у меня есть a ModelComponent
, связанный с a RenderSystem
, ModelComponent
имеет идентификаторы буфера вершин, которые использует система рендеринга. Простое MaterialComponent
, вероятно, будет иметь цветовую или зеркальную прочность и т. Д., Но я хотел, чтобы оно было достаточно гибким, чтобы можно было использовать более одного прохода рендеринга и общие «эффекты», которые не так просты, как простая переменная в MaterialComponent
.
Пытаясь решить эти проблемы, я придумал два решения:
1 - Супер-универсальный компонент материала
Что-то вроде этого:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
и в системе рендеринга я бы зацикливал и передавал униформу в шейдер. Я полагаю, это будет медленно, но достаточно быстро для моих целей.
2 - еще один уровень абстракции, MaterialData
Имея класс для переноса определенных материалов, который может быть унаследован любым специализированным материалом, базовый класс будет иметь что-то вроде, void set_shader_constants(ShaderData* d)
но реализация зависит от каждого класса, и у него MaterialComponent
будет указатель на объект MaterialData.
Я не уверен, какой подход я бы предпочел, но ни один из них не затрагивает тему нескольких проходов или других сложных методов рендеринга.
Есть идеи, как этого добиться?