Meine E / C-Implementierung ist die grundlegende, bei der Entitäten nur IDs sind, Komponenten Daten sind und Systeme auf die Daten einwirken. Im Moment habe ich Probleme mit Objektmaterialien und Rendering im Allgemeinen. Für einfache Objekte habe ich a ModelComponent
, gebunden an a RenderSystem
, ModelComponent
die Vertex-Buffer-IDs, die das Rendering-System verwendet. Eine einfache MaterialComponent
Datei hätte wahrscheinlich eine Farb - oder Spiegelstärke usw., aber ich wollte, dass sie flexibel genug ist, um mehr als einen Renderdurchlauf und allgemeine "Effekte" zu ermöglichen, die nicht so einfach sind wie eine einfache Variable in der MaterialComponent
.
Um diese Probleme zu lösen, habe ich zwei Lösungen gefunden:
1 - Supergenerische Materialkomponente
Etwas wie das:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
und im Render-System würde ich die Uniformen schleifen und an den Shader weitergeben. Ich nehme an, das wäre langsam, aber schnell genug für meine Zwecke.
2 - Eine weitere Abstraktionsebene, MaterialData
Wenn die Basisklasse über eine Klasse verfügt, die bestimmte Materialien umschließt, die von jedem speziellen Material geerbt werden könnten, ist dies in etwa so, void set_shader_constants(ShaderData* d)
aber die Implementierung hängt von jeder Klasse ab, und MaterialComponent
sie verfügt über einen Zeiger auf ein MaterialData-Objekt.
Ich bin mir nicht sicher, welchen Ansatz ich bevorzugen würde, aber keiner davon berührt das Thema von mehreren Durchgängen oder anderen komplexen Rendering-Techniken.
Irgendeine Idee, wie dies erreicht werden kann?