Wie unterscheiden sich TexelFetch und Textur von OpenGL?

18

Ich verstehe die Hauptunterschiede zwischen texelFetchund texture, habe aber einige Fragen zu den Details:

  • Handelt es sich texelFetchum eine Leistungsstrafe? Wie ohne Cache oder so?
  • Sind texelFetchund textureaustauschbar bei der Verwendung GL_NEAREST?
Martin Perry
quelle
1
Sie könnten einen Testfall schreiben und sehen ...
ThorinII
1
Haben Sie vergessen, eine Antwort als akzeptiert zu markieren, oder ist dies noch ein offenes Thema?
Anko

Antworten:

23

texelFetchist ganz anders als texture.

textureist Ihre übliche Texturzugriffsfunktion, die das Filtern und normalisierte ( [0,1]) Texturkoordinaten handhabt . texelFetchgreift direkt auf ein Texel in der Textur zu (keine Filterung), indem nicht normalisierte Koordinaten verwendet werden (z. B. (64,64)im mittleren Texel in einer 128x128-Textur gegenüber (.5,.5)in normalisierten Koordinaten).

Sean Middleditch
quelle
4
+1 Ich möchte hinzufügen, dass texelFetch für den Datenzugriff gedacht ist, wenn die Textur nicht speziell als Bild angezeigt werden soll, sondern für andere Datentypen, im Gegensatz zur Textur, die auf die Texel zugreift, wenn sie als Bilder verwendet werden sollen. Aus diesem Grund werden Filter usw. verwendet. -
concept3d
Gibt es einen Leistungsunterschied?
Lenar Hoyt
1
@mcb: vielleicht, aber ich würde nicht erwarten, dass es sehr groß ist, und es wird wahrscheinlich je nach Hardwarehersteller sehr unterschiedlich sein. Leistung ist die absolut falsche Metrik, um zu entscheiden, welche dieser Funktionen aufgerufen werden soll: Verwenden Sie die für Ihre Situation richtige Metrik (Sie müssen entweder die Filterung der Hardware verwenden und müssen sie verwenden textureoder die Hardware muss keine Filterung durchführen und müssen sie verwenden) texelFetch).
Sean Middleditch
3
@ SeanMiddleditch Wie ist die Leistung in diesem Fall die falsche Metrik? Wenn dies texelFetchschneller ist und die Filterung nach nächsten Nachbarn ausreicht, können Sie den Kontext nicht auf NN-Filterung umstellen. Es wäre vernünftig, ihn vorzuziehen texture.
Lenar Hoyt
@mcb: texelFetchund textureauf grundsätzliche Weise anders arbeiten. Siehe auch die Eingaben: Texturkoordinaten vs. normalisierte Koordinaten. Sie dienen unterschiedlichen Zwecken. Das eine ist nicht nur eine Optimierung des anderen.
Sean Middleditch
6

Da es keine akzeptierte Antwort gibt, füge ich einige Informationen hinzu und wollte nur Dinge hinzufügen, die Sean noch nicht in seiner Antwort erwähnt hat.

TexelFetch behandelt die Textur als Bild, sodass Sie genau auf den Inhalt der Pixel zugreifen können. Normalerweise tun Sie dies, wenn Sie genau diesen Inhalt benötigen, was in wenigen, aber nützlichen Fällen der Fall ist:

  • Bestimmte Nachbearbeitungsfilter (Guassianische Weichzeichnung nutzt die Interpolation von Texturbeispielen aus und kann TexelFetch daher nicht verwenden)
  • Wenn Eckpunkte Daten aus Texturen lesen müssen und dies eine Operation ist, die von 2 Koordinaten abhängig ist

Tex2D behandelt die Textur als Textur. Sie möchten nicht den genauen Inhalt eines Pixels, aber Sie möchten das realistischste Ergebnis. Ein standardmäßiges Texturlesen ist eine sehr komplexe Operation, bei der interpolierte Daten von einer oder mehreren Mipmap-Ebenen gelesen und anschließend erneut interpoliert werden. All diese teuren Operationen sollen visuelle Artefakte vermeiden.

GL_NEAREST funktioniert nicht gleich, da Sie auf den entferntesten Polygonen Daten auf der kleineren Mipmap-Ebene lesen, die nicht genau den Daten entsprechen, die Sie von einem Texelabruf gelesen haben.

In einem Fall funktioniert Tex2D (fast) genauso wie TexelFetch:

  1. Filter ist GL_NEAREST
  2. Sie verwenden eine unvollständige Mipmap-Pyramide mit einer Ebene
  3. Ihre UVs sind keine normalisierten Vertex-Komponenten (aber Sie müssen sie im Shader normalisieren)
Spielentwickler
quelle