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.