Lassen Sie sie sagen, dass ich einen sehr einfachen GLSL Vertex-Shader habe:Werden Operationen in uniformen Variablen in GLSL zwischengespeichert?
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
in vec3 position;
in vec3 color;
out vec3 vertexColor;
void main()
{
mat4 mvp = projection * view * model;
vertexColor = color;
gl_Position = mvp * vec4(position, 1.0);
}
Ist die Variable mvp
für jede Ecke neu berechnet, oder es wird vorberechnet und bis in den einheitlichen Variablen gespeichert auf Änderung abhängt?
Warum wäre es schwierig zu implementieren? Sie müssen lediglich eine Abhängigkeitsstruktur für die Variable während der Kompilierung erstellen und dann alle Variablen aktualisieren, die von einer geänderten Uniformvariablen abhängen. –
@ Bobby-Z: Du sagst "nur", als ob das trivial wäre. Es erfordert auch, dass Sie einen beliebigen Ausdrucksrechner implementieren, der den Wert dieses "Abhängigkeitsbaums" basierend auf den aktuellen Werten der Eingabeuniformen berechnen kann. Es gibt auch die Tatsache, dass Uniformen Shader-Ressourcen aufnehmen, die begrenzt sind. Und Sie würden effektiv einen vierten 'mat4'-Einheitswert erzeugen. Was passiert, wenn eine dieser gefertigten Uniformen dich auf einer Bühne an die Grenzen der Uniform vorbei drängt? –
Es ist trivial, den Abhängigkeitsbaum zu berechnen. Während der Kompilierung finden Sie alle Variablen, auf die im Initialisierungsausdruck des 'mat4' verwiesen wird, finden heraus, ob alle diese Variablen einheitlich sind, oder überprüfen diese Variablen rekursiv, ob sie nur von einheitlichen Variablen abhängen. Die meisten modernen Compiler machen ähnliche Dinge mit Variablen. –