2016-08-08 13 views
7

Pytanie: Dlaczego ta sama ilość pikseli zajmuje znacznie mniej pamięci wideo, jeśli jest przechowywana w kwadratowej teksturze niż w długiej prostokątnej fakturze?OpenGL: Dlaczego tekstury kwadratowe zajmują mniej pamięci?

Przykład: Tworzę tekstury o rozmiarze 360 ​​4x16384 za pomocą komendy glTexImage2D. Format wewnętrzny to GL_RGBA. Pamięć wideo: 1328 MB.

Jeśli tworzę 360 × 256 × 256 tekstur z tymi samymi danymi, zużycie pamięci jest mniejsze niż 100 MB.

Korzystanie ze zintegrowanego procesora graficznego Intel HD4000.

+0

Nie jestem w 100% pewny, ale myślę, że ma to związek z tym, jak OpenGL obsługuje dane pikselowe za pomocą ich połączeń tekstowych. Kiedy Obrazy są kwadratowe, myślę, że ma to związek z potęgą 2, gdy przechowuje dane z tylnego bufora, aby były gotowe do renderowania. –

+0

Czy generujesz mipmapy? Myślę, że nie, ale po prostu, aby się upewnić;) – Mars

+0

@Mars: Masz rację, zapomniałem precyzyjnie, że NIE używam mipmaps. – Szak1

Odpowiedz

6

Nie chodzi o to, że tekstura jest prostokątna. Chodzi o jeden z wymiarów, który jest wyjątkowo mały: mały.

Aby wybrać teksle z tekstur w optymalny sposób, sprzęt będzie wykorzystywał tzw. Swizzling. Ogólną ideą jest to, że zmieni strukturę bajtów w teksturach, tak że piksele, które sąsiadują ze sobą w 2 wymiarach, będą również sąsiadami w pamięci. Ale wykonanie tego wymaga, aby tekstura miała pewien minimalny rozmiar w obu wymiarach.

Teraz sprzęt filtrujący teksturę może zignorować ten minimalny rozmiar i pobierać tylko od pikseli w faktycznym rozmiarze tekstury. Ale ta dodatkowa przestrzeń wciąż tam jest, zajmując miejsce bez żadnego użytecznego celu.

Biorąc pod uwagę to, co widzisz, istnieje duża szansa, że ​​sprzętowy sprzęt Intela ma podstawowy minimalny rozmiar 32 lub 64 piksele.

W OpenGL niewiele można zrobić, aby wykryć tę niekongruencję, poza tym, co tutaj zrobiliście.

+0

Dziękuję, będąc nowicjuszem w OpenGL, nie wiedziałem o swizzlingu. Rzeczywiście, zwiększenie rozmiaru 4x16384 do 32x16384 dla każdej tekstury nie zwiększyło zużycia pamięci (pierwszy wzrost następuje przy 64x16384). To pokazuje, że - jak sugerujesz - implementacja OpenGL dla chipsetów Intela ma co najmniej 32 piksele przydzielone dla kierunku. Zaznaczam twoją odpowiedź jako rozwiązanie. – Szak1

+0

Czy nie ma żadnych narzędzi, takich jak NSight, które mogą to wykryć? – Zouch