Wie viele Texturen kann ich normalerweise gleichzeitig binden?

23

Ich entwickle eine Spiele-Engine, die nur auf moderner Hardware (Shader-Modell 4+) funktioniert. Ich denke, wenn ich damit fertig bin, wird das keine so unvernünftige Voraussetzung sein.

Meine Frage ist: Wie viele Texturen kann ich auf einer modernen Grafikkarte gleichzeitig binden? 16 wäre ausreichend. Kann ich erwarten, dass die meisten modernen Grafikkarten diese Anzahl von Texturen unterstützen?

Meine GTX 460 scheint 32 zu unterstützen, aber ich habe keine Ahnung, ob dies für die meisten modernen Grafikkarten repräsentativ ist.

Avi
quelle
Welche Rendering-API verwenden Sie?
Adam
2
OpenGL natürlich :)
Avi

Antworten:

53

Die Anzahl der Texturen, die an OpenGL gebunden werden können, beträgt nicht 32 oder 16 . Es ist nicht das, womit du kommst glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Diese Funktion ermittelt die Anzahl der Texturen, auf die der Fragment-Shader zugreifen kann .

Jeder Shader hat ein eigenes Limit für die Anzahl der Texturen, die er verwenden kann . Es gibt jedoch auch eine Gesamtzahl von Texturen, die verwendet werden können, Punkt. Dies ist (in OpenGL) definiert durch GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Es gibt also zwei Grenzen: die Texturen pro Stufe und die Texturen insgesamt gebunden.

OpenGL 3.x definiert die Mindestanzahl für das Pro-Stufe-Limit auf 16, sodass die Hardware nicht weniger als 16 Texturen pro Stufe haben kann. Es kann eine höhere Grenze geben, aber Sie wissen, dass Sie mindestens 16 erhalten. 3.x definiert die Mindestanzahl für die insgesamt gebundenen Texturen als 48. AKA: 16 * 3 Stufen. In ähnlicher Weise definiert GL 4.x, dass die Zahlen 16 Texturen pro Stufe und 96 Texturen insgesamt gebunden sind (dh: 16 * 6 Stufen, einschließlich Compute-Shader).

Auch dies sind die Mindestzahlen . Hardware kann (und kann) variieren.

Für bestimmte Hardware können Sie davon ausgehen, dass Hardware der DX10-Klasse mit diesen Zahlen übereinstimmt. Hardware der DX11-Klasse weist einige Abweichungen auf. NVIDIA (GeForce 4xx +) und AMD-High-End-Chips (auch bekannt als GCN-Cores) haben möglicherweise mehr als 16 pro Stufe.

Nicol Bolas
quelle
2
Ich wünschte, dies wäre die akzeptierte Antwort. Das hätte mir 5 Minuten sinnloses Lesen erspart.
Fibbles
3

Ich glaube, 32 ist die maximale Anzahl von Texturen, die derzeit gebunden werden können. Soweit ich das beurteilen kann, hatte sogar die 8800er Serie 32 Textureinheiten.

Soweit ich weiß, benötigen Sie für die Unterstützung von openGL 4.x eine Fermi-Karte oder eine neuere nvidia-Karte (oder eine entsprechende amd-Karte). Die Modelle der höheren Klasse scheinen alle 32 Einheiten zu haben, während die Karten der niedrigsten Klasse (z. B. GT 430) ) haben 16. In den AMD-Datenblättern werden jedoch Zahlen wie 80 oder 128 Textureinheiten aufgeführt, jedoch 32 Farb-ROP-Einheiten, die über Generationen hinweg konstant geblieben zu sein scheinen.

Die GTX 480 hingegen ist mit 60 Textureinheiten und 48 ROP-Einheiten aufgeführt, während Karten für das untere Ende wie die 430 Berichten zufolge nur 16 Textureinheiten und 4 ROP-Einheiten haben. Im Großen und Ganzen bin ich nicht wirklich davon überzeugt, dass diese Nummer die Nummer ist, nach der Sie tatsächlich suchen.

Sie können jedoch die Anzahl der Textureinheiten überprüfen, die für das Rendern von Pipelines ohne feste Funktion verfügbar sind. glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);Wenn Sie also Zugriff auf verschiedene Hardware haben, können Sie dies selbst überprüfen.

BEARBEITEN: Auf dieser Website können Sie die gemeldeten OpenGL-Funktionen aller Arten von Grafikkarten vergleichen, die Ihnen die benötigten Zahlen liefern sollten: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD und nvidia haben kürzlich "bindless textures" eingeführt (amd hat einen anderen Namen dafür), mit dem Sie eine große Anzahl von Texturen verwenden können, ohne sie an Texture Units zu binden. Momentan ist dies nur in openGL verfügbar.


quelle
1
Danach lautet die eigentliche Antwort: "Sie haben so viel, wie die hw bieten kann". Oder anders formuliert, alles sollte so schnell wie möglich ablaufen. (und in OpenGL deckt das fast alle Bereiche ab).
Darkwings
@ Darkwings Ich nehme an, dass das Binden von mehr Texturen, als die Hardware verarbeiten kann, in der Regel zu einem Fehler führt oder der Treiber ein Zeitlimit überschreitet. Ich habe auch falsch verstanden, sagte er Shader-Modell 4+ nicht opengl 4+. Bei den ersten DX10-Karten (X2900- und 8800-Kartenfamilien) scheinen alle mindestens 16 Textureinheiten zu haben.
Ich habe nur die Tatsache unterstrichen, dass es, da es parametrisierbar ist, so sein sollte. Selbst wenn das Spiel auf älteren Karten gecrawlt werden sollte, sollte es nicht hartcodiert sein, sondern eine "vorgeschlagene Anforderung".
Darkwings
4
-1: Diese Antwort ist falsch. Siehe meine Antwort für das Warum (es ist zu lang, um es hier zu erklären).
Nicol Bolas
1
Was möglicherweise nicht sofort offensichtlich ist. Fast niemand benutzt die GL_TEXTURE n GLenums; Verwenden Sie stattdessen GL_TEXTURE0 + n, wobei n der zu bindende Slot ist. Die GLenums gehen nur bis zu 32 Slots, aber das bedeutet nicht, dass OpenGL Sie auf 32 beschränkt. Die Spezifikation garantiert, dass sie sequentiell sein werden. Wenn Sie DSA nicht verwenden, möchten Sie möglicherweise einen Steckplatz für die Bindung zum Erstellen / Ändern reservieren, damit der zum Erstellen / Ändern verwendete Status weniger mit dem zum Zeichnen verwendeten Status interagiert.
Maximus Minimus