PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GLSL: Sprünge vermeiden?


ollix
2006-01-12, 11:20:14
Hi,

ich habe in einem Artikel gelesen, daß man bei Shadern möglichst Sprünge vermeiden sollen und stattdessen versuchen sollte Dinge direkt zu multiplizieren. Ich kann das zwar schon irgendwie nachvollziehen, aber macht das bei so einem Fall Sinn (Beispiel):
// f_x kann nur 1.0 oder 0.0 annehmen
if (f_x == 1.)
v_fur = calculateValueA();
else
v_fur = calculateValueB();

//oder
v_fur = (f_x * calculateValueA()) + ((1.-f_x) * calculateValueB()); Was wäre sinnvoller. Das hängt sicher davon ab, wie teuer die Funktionen sind, aber generell? Würde der Compiler wegoptimieren, wenn der erste Teil des Produkts bereits 0 ist? Wobei das ja wohl wieder in einem Sprung resultieren würde, oder?

In dem gleichen Artikel stand allerdings auch, daß man eben auch auf bool mehr oder weniger verzichtet, weil intern sowieso nur mit floats/vektoren gerechnet wird. Am Besten einzige große float/vektor-Mutliplikationen hintereinander (wo es geht); aber es kann doch keinen Sinn machen, anstelle der Multiplikation einen float für einen boolschen Vergleich, statt gleich eines bools zu verwenden, oder?

Coda
2006-01-12, 12:08:57
Ist f_x eine Konstante?

ollix
2006-01-12, 13:18:04
Nein und ist zum Zeitpunkt des Kompilierens nicht bekannt.

ScottManDeath
2006-01-12, 17:56:30
y = f_x == 1.0 ? blubb : blabbla;

oder die mix funktion zum lerpen nehmen ;)

Coda
2006-01-12, 17:58:24
Das ganze kommt jetzt drauf an. Auf nVIDIA-Hardware wird der Shader-Compiler im Treiber sowieso alles in Predication umwandeln was nicht bei 10 auf dem nächsten Baum sitzt.