Wofür sind Register in HLSL?


7

Ich habe dieses Dokument über HLSL-Register gelesen , aber es ist eher eine Syntaxbeschreibung und keine Zweckerklärung.

Was sind eigentlich Register in HLSL? Wie und wann benutze ich sie? Was passiert, wenn ich es nicht tue (was ist die Standardeinstellung)?

Antworten:


8

Ein gegebenes Shader-Modell setzt einen bestimmten Satz von Registern HLSL aus; Diese Register sind Hardware-Register auf der GPU, wie CPU-Register, haben jedoch verfeinerte Bereiche (zum Beispiel gibt es Register, die für das Halten von Samplern vorgesehen sind).

In Registern werden alle Ihre Daten während der Ausführung Ihres Shaders gespeichert (mit Ausnahme von Daten wie Textur- oder Scheitelpunktpufferdaten, die im RAM der GPU gespeichert sind). Auf einer GPU haben Sie nicht die gleiche Flexibilität beim Lesen und Bearbeiten von Speicher wie auf einer CPU. Es gibt kein "Speichern dieses Werts für einen Moment im RAM", daher muss sich alles in Registern befinden. Dies ist besonders offensichtlich bei alten Shader-Baugruppen (aus der Ära des Shader-Modells 1).

Die Datenübertragung kann auch über diese Register erfolgen, weshalb die Schlüsselwörter in moderneren Shader-Modellen immer noch vorhanden sind. Wenn Sie beispielsweise das Effekt-Framework nicht verwenden, können Sie die Zuordnung Ihres Samplers oder Ihrer Konstantenregister selbst verwalten (z. B. über Methoden wie SetVertexShaderConstant ). In ähnlicher Weise können Daten von Puffern auf Register abgebildet werden; Die Vertex-Eingaberegister erhalten normalerweise Ihre Vertex-Pufferdaten, die ihnen vor der Ausführung Ihres Shaders zugeordnet wurden.

Eine Liste der Register und ihres Zwecks finden Sie auf der MSDN. Hier ist zum Beispiel die Einstellung für VS 5.0.

Oft müssen Sie sie nicht direkt verwenden, ähnlich wie bei CPU-Registern. Sie werden automatisch von den übergeordneten Sprachkonstrukten verwendet, die Sie in Ihrem Shader-Code oder in der API verwenden (z. B. dem oben genannten Effekt-Framework).


3

Die spezifischen Register, mit denen Sie syntaktisch umgehen, sind eine Art E / A-Register. Josh erklärte hervorragend, was Register sind und warum sie auf der GPU verwendet werden. Die Syntax, mit der Sie Variablen in bestimmten Registern deklarieren, dient zum Übertragen von Daten. Auf der CPU erstellen Sie ein Eingabelayout (Vertex Array Object in GL) oder legen Uniformen oder Sampler / Texturen fest. Dadurch werden Werte in Ihren Scheitelpunktpuffern bestimmten Registern zugeordnet (über die Semantik für Scheitelpunktdaten). Der C ++ - Code und der HLSL-Code müssen übereinstimmen, welche Daten sich in welchem ​​Register für die Eingabe sowie für die Ausgabe für MRT und dergleichen befinden.

Wenn Sie Register nicht explizit angeben, wählt die HLSL sie für Sie aus. Sie sollten sich nicht darauf verlassen, wie sie ausgewählt werden. Auch wenn es stabil erscheint, kann es sich in einer zukünftigen Version ändern. Mithilfe der Shader-Introspektions-APIs können Sie bestimmen, welche Register der Compiler ausgewählt hat, damit Sie Ihre Eingabelayouts entsprechend einrichten können. Dies ist weniger effizient und schwieriger als nur das Deklarieren der Register in Ihrem Shader-Code.

Im Wesentlichen sagt das C ++ so etwas wie "Die Kameradaten befinden sich im konstanten Pufferregister 3." Der Shader muss dann diesen Puffer aus Register 3 lesen, sonst funktioniert er nicht richtig. Sie können es mit Namen tun, wie es der alte GL Sie gezwungen hat, aber Sie sollten es nicht tun.

Dies gilt auch für neuere GL / GLSL, allerdings mit unterschiedlicher Syntax und APIs.


0

Register sind eine Art Speicher, der sich auf einem Prozessor befindet und sehr schnell zugänglich ist. Sie sind typischerweise wesentlich kleiner und werden als Eingabe- und Ausgabestellen für Prozessoranweisungen verwendet. HLSL bietet eine Methode zum Zuordnen von Daten zu diesen Registern von der CPU-Seite, die in Ihrem Shader auf der GPU verwendet werden können. Sie sollten immer dann verwendet werden, wenn Sie Daten haben, auf die innerhalb einer GPU verwiesen werden muss, die jedoch nur zur Laufzeit auf der CPU verfügbar sind (z. B. World View-Projektionsmatrizen) und daher in ein GPU-Register kopiert werden müssen. Hier ist ein Artikel, der Register in einem Nicht-Hlsl-Kontext beschreibt: http://en.wikipedia.org/wiki/Processor_register


1
Ich weiß, was ein normales CPU-Register ist. Ich interessiere mich speziell für die HLSL. Wie kann beispielsweise eine Textur (etwas ziemlich Großes) einem kleinen Prozessorregister zugeordnet werden?
NPS

1
Der Textur-Sampler selbst ist wahrscheinlich nicht vollständig im Register gespeichert. ein Verweis auf den Sampler ist.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.