Vielleicht stehe ich gerade auf dem Schlauch... aber scheinbar tut Smoothstep nicht das was es soll.
Prinzipiell wollte ich einen Höhenwert in eine Textur speichern und wieder heraus lesen. Dabei liegen diese zwischen -10 und 2200.
Dachte mir, man könnte nun einfach folgendes machen:
h = smoothstep(-10, 2200, h); // codieren
h = lerp(-10, 2200, h); // decodieren
Es kommt aber dann ein anderes Ergebnis heraus. Wenn man die Funktionen ausformuliert und wegkürzt kommt man zu folgendem:
h = (h+10)/2210; // codieren (ein saturate ist hier für mich erstmal unrelevant)
h = h*2210-10; // decodieren
Bei der Variante bleiben die Werte letztendlich gleich, also wie erwartet. Wenn ich nun die untere Zeile mit dem Lerp austausche, klappt alles wunderbar. Das Smoothstep allerdings nicht. Habe ich da einen Denkfehler? :shock:
[HLSL] Smoothstep verhält sich unerwartet
Re: [HLSL] Smoothstep verhält sich unerwartet
Das verhalten von Smoothstep ist korrekt. Es macht einfach mehr als du erwartest. Hier mal die Beispielimplementierung von AMD die man bei Wikipedia findet.
Deine Annahme was Smoothstep macht, entspricht den ersten Teil der Funktion, du vergisst jedoch die Auswertung des Polynoms.
Code: Alles auswählen
float smoothstep(float edge0, float edge1, float x)
{
// Scale, bias and saturate x to 0..1 range
x = clamp((x - edge0)/(edge1 - edge0), 0.0, 1.0);
// Evaluate polynomial
return x*x*(3 - 2*x);
}
Re: [HLSL] Smoothstep verhält sich unerwartet
Achso, das erklärt es natürlich! Danke für die schnelle Antwort waigie!! :D
Bin bisher immer davon ausgegangen, dass Smoothstep linear interpoliert. Gibt es denn für so eine Linearinterpolation auch eine Funktion?
Bin bisher immer davon ausgegangen, dass Smoothstep linear interpoliert. Gibt es denn für so eine Linearinterpolation auch eine Funktion?
Re: [HLSL] Smoothstep verhält sich unerwartet
Soweit ich weiß gibt es keine Funktion die linear Interpoliert. Aber der Code dafür ist ja auch recht trivial
Code: Alles auswählen
saturate((h-min)/(max-min))
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: [HLSL] Smoothstep verhält sich unerwartet
Kleine Anmerkung: Das sollte man aber in ein Multiply-Add umformen... ;)
a = max - min
b = min / (min - max)
staturate(h * a + b)
a = max - min
b = min / (min - max)
staturate(h * a + b)
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [HLSL] Smoothstep verhält sich unerwartet
lerp()? ;)Zudomon hat geschrieben:Gibt es denn für so eine Linearinterpolation auch eine Funktion?
Re: [HLSL] Smoothstep verhält sich unerwartet
Ja da hab ich mich wohl falsch ausgedrückt! :lol:dot hat geschrieben:lerp()? ;)Zudomon hat geschrieben:Gibt es denn für so eine Linearinterpolation auch eine Funktion?
Meinte damit eher dieses ersten Teil, den Smoothstep da macht, also ohne das Polynom.