Ich suche nach einer eleganten Möglichkeit, Eingabelayouts in meinem directx11-Code zu verarbeiten.
Das Problem, das ich habe, ist, dass ich eine Effektklasse und eine Elementklasse habe. Die Effektklasse kapselt Shader und ähnliche Einstellungen, und die Element-Klasse enthält etwas, das gezeichnet werden kann (3D-Modell, Landschaft usw.).
Mein Zeichencode legt die Geräte-Shader usw. mit dem angegebenen Effekt fest und ruft dann die Zeichenfunktion des Elements auf, um die darin enthaltene tatsächliche Geometrie zu zeichnen.
Das Problem ist folgendes: Ich muss irgendwo ein D3D11InputLayout erstellen. Dies gehört wirklich zur Element-Klasse, da es für den Rest des Systems keine Sache ist, wie dieses Element sein Scheitelpunkt-Layout darstellt. Um das Objekt zu erstellen, benötigt die API jedoch den Vertex-Shader-Bytecode für den Vertex-Shader, der zum Zeichnen des Objekts verwendet wird. In directx9 war es einfach, es gab keine Abhängigkeit, so dass mein Element seine eigenen Eingabelayoutstrukturen enthalten und diese festlegen konnte, ohne dass der Effekt beteiligt war.
Das Element sollte jedoch eigentlich nichts über den Effekt wissen müssen, mit dem es gezeichnet wird. Es handelt sich lediglich um Rendereinstellungen, und das Element ist dazu da, Geometrie bereitzustellen.
Ich weiß also nicht genau, wo ich speichern soll und wie ich das InputLayout für jeden Draw-Aufruf auswählen soll. Ich meine, ich habe etwas zum Laufen gebracht, aber es scheint sehr hässlich.
Dies führt dazu, dass ich entweder etwas Offensichtliches übersehen habe oder dass mein Design, alle Rendereinstellungen in einem Effekt, die Geometrie in einem Element und einen Drittanbieter, der alles zeichnet, zu haben, einfach fehlerhaft ist.
Sie fragen sich nur, wie jemand anderes seine Eingabelayouts in directx11 auf elegante Weise handhabt?