2016-05-19 17 views
1

Vielleicht verstehe ich, wie Textur Mapping implementiert ist falsch. Ich habe kürzlich eine 3D-Engine rein in Java gebaut (ich weiß, dass ich viel Zeit auf meiner Hand habe) und ich habe den Textur-Mapping-Teil fertiggestellt. Wie ich es gemacht habe, als ich das Pixel auf den Bildschirm zeichne, schaue ich die Farbe für die Textur an diesem Ort nach. Ich weiß, dass die Texturfilterung dazu beiträgt, die Unschärfe auf der Textur in großer Entfernung zu reduzieren, wenn man sie in einem schrägen Winkel betrachtet. Aber warum tritt dieses Problem überhaupt auf? Es war nicht in meiner Umsetzung. Warum verlieren wir die Auflösung, wenn wir ein Bild verkleinern?

Hier ist ein Bild von meinem Motor. Warum brauchen wir Texturfilterung (bi-linear, trilinear, Anisotropie ...)

+1

Ich denke, das eigentliche Problem Filterung löst nicht Unschärfe, aber das überschliffene Aussehen, dass Sie auf der anderen Seite Ihres Flugzeugs bekommen. * Bad * Filterung macht es stattdessen verschwommen aussehen. Siehe auch: http://oi62.tinypic.com/zmds7n.jpg – Blorgbeard

+0

Denken Sie darüber nach, warum Bildbearbeitungsprogramme beim Bildschrumpfen filtern. Sie verlieren die Auflösung, weil Sie weniger Pixel zur Verfügung haben, um dasselbe Bild darzustellen. Sie filtern also, um zu versuchen, dass diese Pixel mehr als ein Quellpixel repräsentieren. – Blorgbeard

+0

Nun, wenn ich ein Bild verkleinern, habe ich viel mehr Pixel als, wie viel ich zeichnen muss. Alles, was ich tun muss, ist auszuwählen, welches Pixel ich zeichnen möchte. Das wird nicht zu einem verschwommenen Bild führen. Wenn ich ein Bild dehne, habe ich jedoch nicht genügend Pixel, um die größere Leinwand abzudecken, und ich muss die mittleren Pixel interpolieren, was zu einem unscharfen Bild führt. –

Antwort

4

Zwei Wörter: Nyquist Theorem.

Ihre Textur ist ein Signal und Bildschirm Pixel sind Sampling-Positionen (daher der Begriff Sampler für die Einheit, die, gut, Samples die Textur auf Bildschirm Pixel). Der Nyquist-Theorem besagt, dass das Signal, um ein Signal mit Abtastwerten getreu darzustellen, keine Frequenzen enthalten darf, die über der Hälfte der durchschnittlichen Abtastfrequenz liegen. Wenn diese Einschränkung nicht erfüllt ist, wird Aliasing auftreten. Wenn Sie also eine Textur verkleinern, imitieren Sie sie subsampling, was zu Aliasing führt, wenn die Abtastdistanz im Textur-Signal größer wird (d. H. Die Abtastfrequenz niedriger) als die doppelte Distanz zwischen den am höchsten aufgelösten Textur-Features.

Daher wird in jedem diskreten Probenahmesystem ein sogenannter "Antialiasing-Filter" vor dem Probenehmer installiert.

+0

Schnelle Frage, bevor ich dies als die Antwort stimme. Also ist Anisotropie ein Anti-Aliasing-Algorithmus? –

+0

@JackLe: Nein. Anisotropie ist das Substantiv (wie im Wörterbuch), das beschreibt, dass die Dinge unabhängig von der Richtung nicht gleich sind. Im Fall der Texturfilterung bedeutet Anisotropie, dass die Filtergrenzfrequenz zwischen den Richtungen wechselt, um die Abtastdichte in jeder Richtung wiederzugeben. Außerdem wenden Sie normalerweise keine Filter- "Algorithmen" an, sondern Methoden (geringfügige Bedeutungsunterschiede). – datenwolf

+0

Ich habe einen guten Teil von Wikipedia gelesen. Anscheinend strecken sich die Pixel auf dem Bildschirm unterschiedlich vertikal wie horizontal im 3D-Raum. MIPmapping verwendet isotrope Skalierung, was bedeutet, dass die skalierten Texturen sowohl in x- als auch in y-Richtung um den gleichen Betrag schrumpfen, was für die Art und Weise, wie sich die Pixel auf dem Bildschirm ausdehnen, nicht geeignet ist. Anisotropie verwendet RIP-Mapping, das die Texturen um jeweils eine Richtung streckt und es so ermöglicht, eine "perfekte" Texturmapping-Größe zu finden. Danke tho :) –

0

Sie können leicht verstehen, dass wenn Sie weniger Pixel als die im ursprünglichen Bild vorhandenen anzeigen, Sie Informationen verlieren und unangenehme Artefakte erzeugen. Es gibt zu viele Details, und Sie werfen einige von ihnen eher willkürlich.

Denken Sie an eine Sequenz oder an rote/grüne/blaue Pixel. Wenn Sie alle drei Pixel abtasten, erhalten Sie eine reine rote, rein grüne oder rein blaue Reihe, je nachdem, wo Sie anfangen. Und wenn das Abtastverhältnis nahe bei drei liegt, werden Sie eine Folge von mehreren roten, dann grünen und blauen Pixeln nacheinander beobachten. Dies nennt man Aliasing. (Wie in den alten Zeiten, als Sie einen Sprite durch gerade Dezimierung schrumpften, war der Effekt katastrophal.)

Die Heilung ist es, das Zielpixel eine Mischung der Quellpixel zu sein, die es abdeckt, und das entspricht die Wirkung eines Mittelungsfilters. Tatsächlich werfen Sie die feinen Details gleichmäßiger, indem Sie ihre Amplitude verringern. Der Filter ist anisotrop, wenn die Skalierungsfaktoren in X und Y unterschiedlich sind.

Beachten Sie auch, dass die Interpolation keine Hilfe ist, da sie eine Subpixelauflösung erzeugt, wenn Sie eine Superpixelauflösung benötigen. (Im obigen Beispiel würden Sie eine langsame Mischung erhalten zwischen RGB läuft.)

1

Zwei Wörter: Moiré-Muster

See: https://en.wikipedia.org/wiki/Moir%C3%A9_pattern

Wenn Ihre Textur ein sich regelmäßig wiederholendes Muster in sich hat, dann, wenn Die Frequenz, mit der es abgetastet wird, nähert sich der Frequenz des Musters in der Textur, dann werden diese Muster von großen hellen und dunklen Bereichen angezeigt.

Deshalb werden Checkerboards so oft verwendet, um die Vorteile der bilinearen Filterung zu zeigen.

Versuchen Sie Ihren Motor mit einer Schachbrett Textur.

Beachten Sie, dass ein Frequenz-Aliasing-Effekt ist, wie in der "Nyquist Theorem" -Antwort erwähnt, aber diese besondere Art von Aliasing-Effekt ist einfach zu verstehen, ohne komplexe Mathematik.