2016-12-07 1 views
4

Ich weiß, dass es in WebGL ein Limit von 8 Texturen gibt.Maximale Anzahl von Texturen in WebGL?

Meine Frage ist, ist das Limit global oder pro Shader/Programm weise?

Wenn es pro Shader/Programm weise Grenze bedeutet, bedeutet das, sobald ich die Texturen Uniformen eines Shaders laden, kann ich anfangen, diese Slots für andere Shader wiederzuverwenden? Angenommen, ich verwende TEXTURE0 für eine Form, kann ich TEXTURE0 in einer anderen Form verwenden?

Antwort

10

Die Grenze ist pro Zeichenaufruf. Wenn Sie einen Zeichenaufruf ausführen und ein bestimmtes Shader-Programm aufrufen, sind Sie durch das Limit eingeschränkt, aber Ihr nächster Zeichenaufruf kann völlig unterschiedliche Texturen in demselben Animationsrahmen verwenden.

Auch ist 8 nur die Mindestgarantie. Systeme müssen mindestens acht unterstützen, um als WebGL-konform zu gelten. Aber nettere Grafikkarten unterstützen mehr als acht. Sie können die maximale Anzahl von Bildtexturen für die Plattform abfragen du so bist auf:

var maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); 

Sie auch für Vertex Texturen aussehen:

gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS) 

oder eine Kombination der beiden:

gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) 

Sie können auch eine Seite wie WebGL Report (Disclaimer, ich bin ein Mitwirkender) verwenden, um diese Statistik für die Plattform zu suchen, auf der Sie sich befinden (unter Fragment Shader -> Max Texture Units).

Sie können auch überprüfen, WebGL Stats Graphen der Unterstützung für maximale Bildtexturen zu sehen. Die Grafik MAX_TEXTURE_IMAGE_UNITS zeigt, dass die Unterstützung von bis zu 16 Bildtexturen ziemlich verbreitet ist, da sie in modernen Browsern eine Support-Rate von etwa 95% bietet.

+0

Bedeutet das, ich muss Texturen zwischen jedem Zeichenaufruf wechseln, anstatt Texturen voraus zu laden. Was bringt eine andere Frage, muss ich Uniformen für jeden Ziehanruf hochladen (etwas anderes als Texturen)? Bleiben die in das Programm hochgeladenen Uniformen bestehen? –

+0

Wenn ein Zeichenaufruf andere Texturen als der vorherige Zeichenaufruf verwendet, dann müssen Sie die Texturen zwischen Zeichenaufrufen erneut binden. Die Frage nach Nicht-Textur-Uniformen klingt wie eine separate Frage, vielleicht posten sie eine neue Frage. – emackey