[HLSL] Smoothstep verhält sich unerwartet

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

[HLSL] Smoothstep verhält sich unerwartet

Beitrag 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:
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag 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.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag 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?
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag 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))
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag 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)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag von dot »

Zudomon hat geschrieben:Gibt es denn für so eine Linearinterpolation auch eine Funktion?
lerp()? ;)
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [HLSL] Smoothstep verhält sich unerwartet

Beitrag 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.
Antworten