PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Flimmerfreier Shader


ollix
2006-12-04, 10:39:57
Hi,

ich habe ein Problem mit Flimmern. Es wird viel darüber gesprochen, aber ich verstehe es nicht ganz bzw. erst recht nicht wie man dies verhindert.

So wie ich mir das immer vorgestellt habe, wir bei entfernten Polygonen dieses mit zu wenig Fragmenten gefüllt, wodurch bei der Berechnung stärkere Schwellen zwischen den einzelnen liegen und daraus stärkere Farbunterschiede auftreten können, die von einem aufs nächste Fragment bei Bewegung wandern. So eine Art Unterabtastung. Ich habe hier im Forum aber irgendwo, irgendwann mal von normalem "NdotL-Normalmapping" gelesen was flimmert - ich frage mich wieso dies flimmert, wenn man Normal Maps verwendet, sollten da doch auch Mip-Maps enthalten sein, durch deren "Mittelwerte" es nicht zu Unterabtastung kommt, oder?

Oder gibt es da eher verschiedene Faktoren die fürs Flimmern verantwortlich sind? In der Diskussion habe ich vom "Nyquist-Shannon-Abtasttheorem" gelesen, aber nicht verstanden was mir dieses sagen soll, in der Frage wie man seine Shader zu schreiben hat?

Kennt hier jemand den Zusammenhang und kann erklären, wie man so zu flimmerfreien Shadern kommt?

danke

Asmodeus
2006-12-04, 11:18:59
Flimmern, welches durch Shader verursacht wird, kenne ich in erster Linie im Zusammenhang mit dem sogenannten Shader-Aliasing. Klassisches Beispiel dafür sind die Aliasing-Artefakte beim normalen Shadowmapping. Das führt dann zu dem unangenehmen Flimmern, genauso wie bei Geometriekanten ohne Antialiasing.

http://www.inf.uni-konstanz.de/~colditz/Vergleich01.jpg

Gut zu erkennen ist die Sache auf dem linken kleinen Bild. Auf der rechten Seite wurde der Sache entgegengewirkt, indem man eben einfach im Shader auch noch ein Antialiasing für die entstehenden "Shaderkanten" mit Hilfe von Ableitungsfunktionen dfdx/dfdy berechnet. Leider kostet das ne Menge Rechenpower.

Gruss, Carsten.

Xmas
2006-12-04, 12:46:28
Der Texturfilter verhindert (genauer: mindert) Aliasing indem er die maximale Frequenz des "Textursignals" limitiert. Höhere Frequenzen kann man in etwa als steilere Signalflanken verstehen. Mit einer bestimmten Textur und einem bestimmten Texturfilter bekommt man einen maximalen Flankenanstieg, und ist dieser flach genug, hat man in der Regel kein Flimmern, weil das Abtasten über das Pixelraster keine Spitzen oder Täler "übersehen" kann.

Shader sind allerdings in aller Regel nichtlinear. Manche Signalflanken werden flacher, andere wiederum steiler. Extrem ist das z.B. bei specular Lighting, wo potenziert wird.

Das Skalarprodukt ist eigentlich eine lineare Operation, Normal Mapping wird aber dadurch nichtlinear dass die interpolierten Vektoren renormalisiert werden müssen. Die gemittelte Normale zwischen (1, 0, 0) und (0, 1, 0) ist eben nicht (0.5, 0.5, 0) sondern etwa (0.707, 0.707, 0). Bei einem Lichtvektor von (1, 0, 0) verläuft der Übergang zwischen den Texeln (1, 0, 0) und (0, 1, 0) also nicht gleichmäßig linear von 1 bis 0, sondern als Cosinus.

Bei den benachbarten Texeln (1, 0, 0), (0, 1, 0) und (1, 0, 0) ergäbe sich somit in der Mitte ein relativ schmales "Tal" das leicht übersehen wird wenn mit Texel : Pixel-Verhältnis 1:1 abgetastet wird.

Gast
2006-12-04, 20:44:42
ich frage mich wieso dies flimmert, wenn man Normal Maps verwendet, sollten da doch auch Mip-Maps enthalten sein, durch deren "Mittelwerte" es nicht zu Unterabtastung kommt, oder?


meines wissens kommt das flimmern in erster linie vom (oft gleichzeitig mit normalmapping eingesetztem) specularmapping, reines normalmapping flimmert so gut wie nie.