Seite 1 von 1

[HLSL] Smoothstep verhält sich unerwartet

Verfasst: 07.08.2014, 19:11
von Zudomon
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:

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 07.08.2014, 20:01
von waigie
Das verhalten von Smoothstep ist korrekt. Es macht einfach mehr als du erwartest. Hier mal die Beispielimplementierung von AMD die man bei Wikipedia findet.

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);
}
Deine Annahme was Smoothstep macht, entspricht den ersten Teil der Funktion, du vergisst jedoch die Auswertung des Polynoms.

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 07.08.2014, 20:15
von Zudomon
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?

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 07.08.2014, 20:32
von waigie
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))

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 07.08.2014, 20:58
von Spiele Programmierer
Kleine Anmerkung: Das sollte man aber in ein Multiply-Add umformen... ;)
a = max - min
b = min / (min - max)

staturate(h * a + b)

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 08.08.2014, 01:36
von dot
Zudomon hat geschrieben:Gibt es denn für so eine Linearinterpolation auch eine Funktion?
lerp()? ;)

Re: [HLSL] Smoothstep verhält sich unerwartet

Verfasst: 08.08.2014, 09:41
von Zudomon
dot hat geschrieben:
Zudomon hat geschrieben:Gibt es denn für so eine Linearinterpolation auch eine Funktion?
lerp()? ;)
Ja da hab ich mich wohl falsch ausgedrückt! :lol:
Meinte damit eher dieses ersten Teil, den Smoothstep da macht, also ohne das Polynom.