Speichern von Variablen und Typen für freizugebende Shader
Das Klassenbindungsobjekt ist ein Namespace für Variablen und Typen, die von mehreren Shadern gemeinsam verwendet werden können. Wenn Sie ein Klassenbindungsobjekt in einem Aufruf zum Erstellen eines Shaders übergeben, sammelt die Laufzeit eine Liste von Variablen und Typen, die jede Schnittstelle im Shader implementieren können, und speichert die Namen dieser Variablen und Typen im Klassenbindungsobjekt.
Wenn Sie daher die ID3D11ClassLinkage::GetClassInstance-Methode aufrufen, um Klasseninstanzen aus dem Klassenverknüpfungsobjekt zu generieren, kann die Laufzeit die Variable oder den Typ abrufen, die bzw. der dem In jedem Shader bereitgestellten Namen entspricht (wenn dieser Name für einen bestimmten Shader gültig ist), und der mit dem angegebenen Klassenverknüpfungsobjekt erstellt wird.
Angenommen, Sie verfügen über eine Light-Klasse, die eine Color-Schnittstelle implementiert, und verwenden diese Klasse in Ihrem Scheitelpunkt-Shader und Pixel-Shader. Wenn Sie einen Shader erstellen (z. B. durch Aufrufen von ID3D11Device::CreatePixelShader),bestimmt die Laufzeit, dass der Light-Klassentyp sowohl in Vertex- als auch in Pixelshadern verfügbar ist, und fügt dem Klassenverknüpfungsobjekt den Light-Klassentyp hinzu. Sie können dann eine Light-Instanz an einem gewünschten Speicherort erstellen, die Ressourcen für beide Shader binden und diese Instanz im Klasseninstanzarray übergeben, wenn Sie den Shader auf das Gerät festlegen (z. B. durch Aufrufen von ID3D11DeviceContext::P SSetShader). Die Runtime führt dann die folgende Sequenz aus:
- Überprüft, ob die Instanz mit demselben Klassenverknüpfungsobjekt erstellt wurde.
- Überprüft, ob der Light-Klassentyp sowohl in Vertex- als auch in Pixel-Shadern verfügbar ist.
- Wählt die richtigen Funktionstabellen aus, die für die Vertex- und Pixel-Shader unterschiedlich sein können.
- Sendet die Offsets, die die Instanz bereitstellt, nach unten.
Das Klassenbindungsobjekt ist letztendlich ein Repository mit Typ- und Variablennamen. Die maximale Anzahl von Namen, die für jedes Element (Typ und Variable) verfügbar sind, beträgt 64.000. Je länger der Typ- und Variablenname ist, desto höher ist die Speicheranforderung für die Schnittstellenmetadaten, die pro Shader gespeichert werden. Dies liegt daran, dass die Laufzeit eine Zuordnung für diese Namen für jeden Shader speichern muss.