2017-08-24 1 views
2

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?

Antwort

6

Könnte eine bestimmte Implementierung diesen Wert cachen? Sicher. Werden sie?

Ich würde nicht davon ausgehen, dass sie würden. Ein solches Caching wäre schwierig zu implementieren, da es erforderlich ist, solche Ausdrücke vor Zeichenaufrufen auf der Grundlage eines einheitlichen Zustands zu bewerten und diese Ausdrücke dann in den Code hochzuladen.

Wenn Sie einen Zustand haben, der aus mehreren gleichmäßigen Werten berechnet wird, und Sie glauben, dass eine solche Berechnung ein Leistungsproblem darstellt, sind Sie derjenige, der sie berechnen sollte.

+0

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. –

+0

@ 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? –

+0

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. –