2016-08-08 6 views
7

Frage: Warum nimmt dieselbe Menge an Pixeln in einer quadratischen Textur dramatisch weniger Videospeicher an als in einer langen rechteckigen Textur?OpenGL: Warum brauchen quadratische Texturen weniger Speicher?

Beispiel: Ich erstelle 360 ​​4x16384 Größe Texturen mit dem Befehl glTexImage2D. Internes Format ist GL_RGBA. Videospeicher: 1328 MB.

Wenn ich 360 256x256 Texturen mit den gleichen Daten erstellen, ist die Speicherauslastung weniger als 100 MB.

Verwendung einer integrierten Intel HD4000 GPU.

+0

Ich bin nicht 100% sicher, aber ich denke, es hat damit zu tun, wie OpenGL die Pixeldaten mit ihren GlTexture Calls behandelt. Wenn die Bilder quadratisch sind, denke ich, dass es mit der Potenz von 2 zu tun hat, wenn die Daten im Hintergrundpuffer gespeichert werden, damit sie für das Rendern bereit sind. –

+0

Generieren Sie Mipmaps? Ich denke du tust es nicht, aber nur um sicher zu sein;) – Mars

+0

@Mars: Du hast Recht, habe vergessen zu präzisieren, dass ich KEINE Mipmaps benutze. – Szak1

Antwort

6

Es geht nicht darum, dass die Textur rechteckig ist. Es ist eine der Dimensionen, die extrem klein ist.

Um Texel aus Texturen optimal auszuwählen, verwendet die Hardware das sogenannte Swizzling. Die allgemeine Idee ist, dass es die Bytes in der Textur so umstrukturiert, dass Pixel, die in zwei Dimensionen nebeneinander liegen, ebenfalls Nachbarn im Speicher sind. Dies erfordert jedoch, dass die Textur in beiden Dimensionen eine bestimmte Mindestgröße aufweist.

Jetzt kann die Texturfilterhardware diese Mindestgröße ignorieren und nur von Pixeln innerhalb der tatsächlichen Größe der Textur abrufen. Aber dieser zusätzliche Speicher ist immer noch da und nimmt Platz für keinen nützlichen Zweck.

Angesichts der Tatsache, dass Sie sehen, gibt es eine gute Chance, dass Intels Swizzling-Hardware eine minimale Basisgröße von 32 oder 64 Pixel hat.

In OpenGL gibt es nicht viel, was Sie tun können, um diese Inkongruenz anders als das, was Sie hier getan haben, zu erkennen.

+0

Danke, OpenGL neu zu sein, wusste ich nicht über Swizzling. In der Tat erhöhte die Erhöhung der 4x16384-Größe auf 32x16384 für jede Textur die Speichernutzung nicht (die erste Erhöhung erfolgt bei 64x16384). Dies zeigt, dass - wie Sie vorschlagen - die OpenGL-Implementierung für Intel-Chipsätze mindestens 32 Pixel für eine Richtung zugewiesen hat. Ich habe Ihre Antwort als Lösung markiert. – Szak1

+0

Gibt es keine Tools wie NSight, die das erkennen können? – Zouch

Verwandte Themen