Ist es empfehlenswert, alle verfügbaren Textureinheiten zu verwenden?

9

Wenn ich mehrere Texturen auf ein Netz anwende, wie beim Bump-Mapping, binde ich die Texturen normalerweise an die ersten festen Textureinheiten, z. B.: Diffus = Einheit 0, Bump = Einheit 1, spiegelnd = Einheit 2, und verwende diese dann weiterhin für jede unterschiedliches Netz mit unterschiedlichen Texturen. Aber ich habe mich immer gefragt, warum glActiveTextureso viele Textureinheiten unterstützt werden (im vorherigen Link steht mindestens 80).

Daher kam mir der Gedanke, dass eine Möglichkeit zum Verwalten von Texturen darin besteht, unterschiedliche Texturen an jede verfügbare Einheit zu binden und diese aktiviert zu lassen, indem lediglich der einheitliche Sampler-Index aktualisiert wird. Dies sollte die Renderleistung verbessern, indem die Anzahl der Texturschalter verringert wird. Wenn Sie weniger Texturen als die maximalen Textureinheiten haben, müssen Sie niemals eine Textur lösen.

Ist dies die Standardpraxis für OpenGL-Echtzeitanwendungen (ich glaube, dies gilt auch für D3D)? Und gibt es nicht offensichtliche Auswirkungen auf die Leistung dieses Ansatzes? Speicheraufwand vielleicht?

glampert
quelle

Antworten:

11

Moderne Hardware hat nicht wirklich das Konzept von Texturbindungspunkten, wie es von OpenGL verfügbar gemacht wird. Vielmehr verwendet die Shader-Einheit einen Deskriptor (der nur eine Art Fettzeiger ist), der möglicherweise jede Textur adressieren kann, solange sie sich im Videospeicher befindet. Dies macht Dinge wie bindlose Texturen möglich. Die große Menge an "Textureinheiten", die in aktuellen Implementierungen verfügbar sind, versucht einfach, diesen jetzt irrelevanten Teil der API von Hand zu winken.

Die empfohlene Methode zum Implementieren Ihrer Aufgaben (Vermeiden des erneuten Bindens von Texturen) ist die Verwendung von Textur-Arrays , mit denen Sie dynamisch in eine Reihe von Texturen im Shader indizieren können, solange alle vorhanden sind das gleiche Format und die gleiche Größe. Diese Präsentation enthält weitere Details zu diesen und anderen Techniken zur Reduzierung des Treiberaufwands beim Rendern mit modernem OpenGL: Annäherung an den Null-Treiber-Overhead

Yuriks
quelle
Ich habe diese Präsentation schon einmal gesehen, sie ist sehr gut. Ich wusste jedoch nicht, was Sie im ersten Absatz erwähnen, also danke für diese Info!
Glampert