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.
Antworten:
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.
quelle
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