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
, ModelComponent
ma identyfikatory bufora wierzchołków, których używa system renderujący. Prosty MaterialComponent
prawdopodobnie 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 MaterialComponent
miał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ąć?
źródło