Share via


Speichern von Variablen und Typen für Shader, die freigegeben werden sollen

Das Klassenverknüpfungsobjekt ist ein Namespace für Variablen und Typen, die von mehreren Shadern gemeinsam verwendet werden können. Wenn Sie ein Klassenverknüpfungsobjekt in einem Aufruf zum Erstellen eines Shaders übergeben, sammelt die Runtime eine Liste von Variablen und Typen, die jede Schnittstelle im Shader implementieren können, und speichert die Namen dieser Variablen und Typen im Klassenverknüpfungsobjekt.

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 dem Namen entspricht, der in jedem Shader bereitgestellt wird (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 Sie verwenden diese Klasse in Ihrem Vertex-Shader und Pixelshader. 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 an einem gewünschten Speicherort eine Light-instance erstellen, die Ressourcen für beide Shader binden und diese instance im Klasseninstanzenarray ü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:

  1. Überprüft, ob die instance mit demselben Klassenverknüpfungsobjekt erstellt wurde.
  2. Überprüft, ob der Light-Klassentyp sowohl in Vertex- als auch in Pixelshadern verfügbar ist.
  3. Wählt die richtigen Funktionstabellen aus, die sich für die Vertex- und Pixelshader unterscheiden können.
  4. Sendet die Offsets, die vom instance bereitgestellt werden.

Das Klassenverknüpfungsobjekt ist letztendlich ein Repository von 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 die Typ- und Variablennamen sind, desto höher ist die Speicheranforderung für die Schnittstellenmetadaten, die pro Shader gespeichert werden. Dies liegt daran, dass die Runtime eine Zuordnung für diese Namen für jeden Shader speichern muss.

Dynamische Verknüpfung

Dynamische Verknüpfung