Mi implementación de E / C es la básica donde las entidades son solo identificaciones, los componentes son datos y los sistemas actúan sobre los datos. En este momento estoy teniendo problemas con los materiales de objetos y el renderizado en general. Para objetos simples, tengo un ModelComponent
, vinculado a a RenderSystem
, ModelComponent
tiene los identificadores de búfer de vértices que usa el sistema de renderizado. Un simple MaterialComponent
probablemente tendría color o fuerza especular, etc., pero quería que fuera lo suficientemente flexible como para permitir más de un paso de renderizado y "efectos" generales que no son tan fáciles como una variable simple en el MaterialComponent
.
Intentando resolver estos problemas se me ocurrieron dos soluciones:
1 - Componente de material súper genérico
Algo como esto:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
y en el sistema de renderizado, me enrollaría y pasaría los uniformes al sombreador. Supongo que esto sería lento, pero lo suficientemente rápido para mis propósitos.
2 - Otra capa de abstracción, MaterialData
Al tener una clase para envolver materiales específicos, que podría ser heredada por cualquier material especializado, la clase base tendría algo parecido, void set_shader_constants(ShaderData* d)
pero la implementación depende de cada clase, y MaterialComponent
tendría un puntero a un objeto MaterialData.
No estoy seguro de qué enfoque preferiría, pero ninguno de estos toca el tema de múltiples pases u otras técnicas de representación complejas.
¿Alguna idea sobre cómo lograr esto?