Mon implémentation E / C est celle de base où les entités ne sont que des ID, les composants sont des données et les systèmes agissent sur les données. En ce moment, j'ai des problèmes avec les matériaux des objets et le rendu en général. Pour les objets simples, j'ai un ModelComponent
, lié à un RenderSystem
, ModelComponent
a les ID de tampon de vertex que le système de rendu utilise. Un simple MaterialComponent
aurait probablement une couleur ou une force spéculaire, etc., mais je voulais qu'il soit suffisamment flexible pour permettre plus d'un passage de rendu et des "effets" généraux qui ne sont pas aussi faciles qu'une simple variable dans le MaterialComponent
.
En essayant de résoudre ces problèmes, j'ai trouvé deux solutions:
1 - Composant matériel super générique
Quelque chose comme ça:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
et dans le système de rendu, je bouclais et passais les uniformes au shader. Je suppose que ce serait lent, mais assez rapide pour mes besoins.
2 - Une autre couche d'abstraction, MaterialData
Ayant une classe pour envelopper des matériaux spécifiques, qui pourraient être hérités par n'importe quel matériel spécialisé, la classe de base aurait quelque chose comme, void set_shader_constants(ShaderData* d)
mais l'implémentation dépend de chaque classe et MaterialComponent
aurait un pointeur sur un objet MaterialData.
Je ne sais pas quelle approche je préférerais, mais ni l'un ni l'autre ne touche le sujet des passes multiples ou d'autres techniques de rendu complexes.
Une idée sur la façon d'accomplir cela?