Minha implementação de E / C é básica, onde Entidades são apenas IDs, Componentes são dados e Sistemas agem nos Dados. No momento, estou tendo problemas com materiais de objetos e renderização em geral. Para objetos simples, eu tenho um ModelComponent
, vinculado a um RenderSystem
, ModelComponent
tem os IDs do buffer de vértice que o sistema de renderização usa. Um simples MaterialComponent
provavelmente teria cor ou força especular, etc., mas eu queria que fosse flexível o suficiente para permitir mais de um passe de renderização e "efeitos" gerais que não são tão fáceis quanto uma variável simples no MaterialComponent
.
Tentando resolver esses problemas, criei duas soluções:
1 - Componente material super-genérico
Algo assim:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
e no sistema de renderização eu passava e passava os uniformes para o shader. Suponho que isso seria lento, mas rápido o suficiente para meus propósitos.
2 - Outra camada de abstração, MaterialData
Tendo uma classe para agrupar materiais específicos, que poderiam ser herdados por qualquer material especializado, a classe base teria algo parecido, void set_shader_constants(ShaderData* d)
mas a implementação depende de cada classe e MaterialComponent
teria um ponteiro para um objeto MaterialData.
Não tenho certeza de qual abordagem eu preferiria, mas nenhuma delas aborda o assunto de várias passagens ou outras técnicas complexas de renderização.
Alguma idéia de como fazer isso?