Einzelne Elemente statisch machen
-
Hallo Leute ich bins wieder und hab wieder eine Frage zu Sicehrheit.
Ich war dabei eine Shaderklasse zu Schreiben und habe bemerkt, dass ich garnicht an mein D3D11Device komme, was in einer anderen Klasse ist.Ich habe eine Art Stammbaum gemacht und der ist so aufgebaut:
Engine - Direct3D - Renderer - GShader
Jetzt ist in der Engin Klasse alles drine zur initialisierung, halt alle Befehle, die später öffnetlich benutzbar sind.
Ist es irgendwie möglich jetzt von der GShader klasse den Memebr _Device von der Direct3D Klasse zu bekommen, ohne die Direct3D klasse als Singleton zu machen ???
Ich habe mir überlegt die Engine Klasse als globale variable anzulegen und dann private Funktionen wie GetCurrentDevice() zu machen, wo dann einfach der gerade verwendete Device ist usw....
Was denkt ihr ??
Dankeschön :3
-
Wieso gibst Du nicht einfach dem Renderer das Device mit, sodass der es wiederum an die Shaderklasse geben kann?
-
Weil die Shader classe eigendlich unabhängig von der Renderklasse ist.Die Renderklasse rendert später meshes indem das mesh übergeben wird und die vertex/index buffer sowie die shader im mesh gerendert werden.
-
Also ich verstehe das Problem nicht. Irgendwer muss ja die Shaderklassen-Instanzen erstellen. Und demjenigen (und notfalls dem darüber, wie auch immer die Hierarchie ist) kannst Du doch einfach das Device geben und es bis nach unten runterreichen. So hat das am Ende jeder Shader und das ist schön.
Und falls sich das Device ändert oder so, kannst Du die Änderung von Direct3D ja wieder zu demjenigen leiten, der für die Shader verantwortlich ist. Wie eine ganz normale Befehlskette in einer Hierarchie halt.
-
Ja mir ist schon klar was irh meint ich hab da eine gute Idee.
Das Problem ist dabei dass ich ja folgendes später machen will:
GShader* diffuse = CreateShader();
Das wird dann in der Engine einfach als folgendes deklariert:
GShader* CreateShader() { return new GShader(_device); }
Ich kann ja nicht den Benutzer die Deviceübergabe überlassen.
Die Hierarchie ist eigendlich nicht wichtig es geht mir nur um die Übersicht
-
Ich hoffe, Du machst da noch einen Smartpointer drum.

Und ja, ich würde es dem Benutzer überlassen. Das ist eine globale Methode und ein Shader benötigt eben ein Device, da würde ich nicht einfach verschleiern, dass es so ist. Es ist transparenter, wenn das dabei steht. Oder Du erstellst eben in einer der oberen Hierarchieklassen die Methode CreateShader(), dann fügt die das hinzu, das ist dann auch okay. Aber bei ner globalen Methode ohne Parameter läuft alles auf global hinaus und na ja... dann kannst Du Dir eigentlich auch sparen Engine, Direct3D usw. als Klassen zu machen, denn mehr als eine Instanz können ab dann keinen Sinn mehr ergeben.