Patrzę na źródło aplikacji OpenGL, która używa cieniowania. Jeden szczególności shader wygląda następująco:Stałe wartości zmiennoprzecinkowe w modułach cieniujących GLSL - jakikolwiek powód używania uniformów?
uniform float someConstantValue;
void main()
{
// Use someConstantValue
}
Mundur jest ustawiony raz z kodu i nie zmienia się w całym czasie wykonywania aplikacji.
W jakich przypadkach chciałbym zadeklarować someConstantValue
jako uniform
, a nie jako ?
Edytuj: Aby wyjaśnić, stała wartość jest stałą fizyczną.
"Różnica w wydajności między używaniem munduru lub stałej jest ** prawdopodobnie ** znikoma" Nie jest dobrze zgadywać. Deklaracja stałej wartości pozwala kompilatorowi GLSL wykonywać optymalizacje, które w przeciwnym razie nie byłyby możliwe. Niestety, kompilatory GLSL zwykle mają błędy i zachowują się w nieprzewidywalny sposób. Tak więc ogólna odpowiedź naprawdę nie jest możliwa. Napotkałem poważne różnice w wydajności między używaniem tablic stałych i niezmiennych (w zależności od ich długości), chociaż ich wartość nigdy nie zostanie zmodyfikowana. Zakładam, że jest to błąd kompilatora. – Tara
Mimo że poprzedni komentarz był prawdopodobnie dokładny w tym czasie, można się teraz spodziewać tego typu kompilacji na czas. Jednolite wartości można zoptymalizować tak, jakby były stałymi. Zobacz [this] (https://www.khronos.org/opengl/wiki/Core_Language_ (GLSL) #Dynamically_uniform_expression), aby uzyskać więcej informacji. –