La mia implementazione E / C è quella di base in cui le entità sono solo ID, i componenti sono dati e i sistemi agiscono sui dati. In questo momento ho problemi con i materiali degli oggetti e il rendering in generale. Per oggetti semplici ho un ModelComponent
, legato a un RenderSystem
, ModelComponent
ha gli ID del buffer dei vertici utilizzati dal sistema di rendering. Un semplice MaterialComponent
avrebbe probabilmente una forza cromatica o speculare, ecc., Ma volevo che fosse abbastanza flessibile da consentire più di un passaggio di rendering e "effetti" generali che non sono facili come una semplice variabile nel file MaterialComponent
.
Cercando di risolvere questi problemi, ho trovato due soluzioni:
1 - Componente materiale super-generico
Qualcosa come questo:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
e nel sistema di rendering farei un ciclo e passerei le uniformi allo shader. Suppongo che questo sarebbe lento, ma abbastanza veloce per i miei scopi.
2 - Un altro strato di astrazione, MaterialData
Avendo una classe per avvolgere materiali specifici, che potrebbero essere ereditati da qualsiasi materiale specializzato, la classe base avrebbe qualcosa di simile void set_shader_constants(ShaderData* d)
ma l'implementazione dipende da ogni classe e MaterialComponent
avrebbe un puntatore a un oggetto MaterialData.
Non sono sicuro di quale approccio preferirei, ma nessuno di questi tocca l'argomento di passaggi multipli o altre tecniche di rendering complesse.
Qualche idea su come realizzare questo?