PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Smoothstep in Hardware?


marco42
2004-02-08, 17:01:35
Hi

Weiss jemand ob die smoothstep Funktion(OpenGL Shading Language S. 49 (http://www.3dlabs.com/support/developer/ogl2/downloads/ShaderSpecV1.051.pdf)) schon in Hardware implementiert ist? Und wenn, wie viel Takte die braucht.

Demirug
2004-02-08, 17:30:22
Das es sich um eine eingebaute Funktion handelt muss sie verfügbar sein.

In der Dokumentation steht dafür die Formel:

t = clamp ((x – edge0) / (edge1 – edge0), 0, 1);
return t * t * (3 – 2 * t);

Wenn ich mich nicht verrechnet habe sind das 8 Basisoperationen.

1. a = x-edge0
2. b = edge1-edge0
3. c = 1/b
4. d = sat(a*c)
5. e = 2*d
6. f = 3-e
7. g = d*d
8. h = f*g

Auf einem R300 sollte es komplett in der Skalareinheit (8 Takte) laufen. Bei den FXen ist es schwer vorherzusagen.

*Ich schiebe das mal zur Technik*

marco42
2004-02-08, 19:09:42
Original geschrieben von Demirug
Das es sich um eine eingebaute Funktion handelt muss sie verfügbar sein.

In der Dokumentation steht dafür die Formel:

t = clamp ((x – edge0) / (edge1 – edge0), 0, 1);
return t * t * (3 – 2 * t);

Wenn ich mich nicht verrechnet habe sind das 8 Basisoperationen.

1. a = x-edge0
2. b = edge1-edge0
3. c = 1/b
4. d = sat(a*c)
5. e = 2*d
6. f = 3-e
7. g = d*d
8. h = f*g

Auf einem R300 sollte es komplett in der Skalareinheit (8 Takte) laufen. Bei den FXen ist es schwer vorherzusagen.

*Ich schiebe das mal zur Technik*

Ja, soweit war es mir schon klar, aber ich dachte dabei an Optimierungen. Da sie fuer prozeduale Texturen die Wahl der besten Filtermethode ist. Fuer viele Sachen mag ja noch ein einfach Boxfilter ausreichen, bei anderen werden AFAIK Aliasingeffecte zu gross. Unter Renderman wird sie ziemlich oft verwendet. Und IMHO ist diese ganze HLSL/GSlang Geschichte nichts anderes, als Renderman in Hardware zu implementieren. Deshalb wird es wohl eine Funktion, die die Hersteller auf sehr stark versuchen werden zu optimieren.

zeckensack
2004-02-08, 19:30:18
Eine Instruktion kann man noch sparen. Nach ARB_fragment_program-Syntax:
TEMP t;
TEMP q;
TEMP smooth_step;
SUB q.w,edge1,edge0;
RCP q.w,q;
MUL t.w,edge0,q;
MAD_SAT t.w,x,q,-t; //bis hierhin nicht besser als Demirug's Lösung
MAD smooth_step.w,t,-2,3;
MUL smooth_step.w,t;
MUL smooth_step,smooth_step.w,t.w;

Xmas
2004-02-08, 21:59:30
Ein hervorragendes Beispiel für Funktionen, die man auch sehr gut mit Textur-Lookups realisieren kann.

Was die Optimierungen angeht, in den meisten Fällen kann man sowieso davon ausgehen dass (edge1 - edge0) oder sogar gleich edge1 und edge0 konstant sind, womit man nochmal 2 bzw. 3 Instruktionen spart. Ich glaube nicht, dass sich darüber hinaus noch eine besondere Hardware-Optimierung lohnt.