Moja implementacja E / C jest podstawowa, w której jednostki to tylko identyfikatory, komponenty to dane, a systemy działają na danych. W tej chwili mam problem z materiałami obiektowymi i renderowaniem w ogóle. Dla prostych objetcs mam a ModelComponent, powiązane z a RenderSystem, ModelComponentma identyfikatory bufora wierzchołków, których używa system renderujący. Prosty MaterialComponentprawdopodobnie miałby siłę koloru lub połysku itp., Ale chciałem, aby był wystarczająco elastyczny, aby umożliwić więcej niż jedno przejście renderowania i ogólne „efekty”, które nie są tak proste jak zwykła zmienna w MaterialComponent.
Próbując rozwiązać te problemy, wpadłem na dwa rozwiązania:
1 - Super-ogólny składnik materiałowy
Coś takiego:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
a w systemie renderowania zapętlałem mundury i przekazywałam je do shadera. Przypuszczam, że byłoby to powolne, ale wystarczająco szybkie do moich celów.
2 - Kolejna warstwa abstrakcji, MaterialData
Mając klasę do owijania określonych materiałów, które mogą być dziedziczone przez dowolny specjalistyczny materiał, klasa podstawowa miałaby coś takiego, void set_shader_constants(ShaderData* d)ale implementacja zależy od każdej klasy i MaterialComponentmiałaby wskaźnik do obiektu MaterialData.
Nie jestem pewien, które podejście wolę, ale żadne z nich nie dotyczy tematu wielokrotnych przejść ani innych skomplikowanych technik renderowania.
Masz pomysł, jak to osiągnąć?