Jaki jest optymalny rozmiar tekstury?

13

Niedawno dodałem do mojego projektu program do pakowania tekstur, który spakuje pewną liczbę tekstur do jednego, w następujący sposób:

Pakowana tekstura

Na przykład ten ma rozmiar 582x1023 pikseli. Celem dodania tych spakowanych tekstur było oczywiście zwiększenie wydajności, dlatego chciałem znaleźć optymalny rozmiar tekstury dla tekstur OpenGL (przy użyciu LWJGL). Odkryłem, że zgodnie z tym na przykład szeroko obsługiwany maksymalny rozmiar tekstury to 1024x1024 . Dziwi mnie to, ponieważ oczywiście wiele tekstur byłoby większych, więc co się z nimi dzieje? Jestem pewien, że większość kart graficznych obsługuje większe tekstury. Czy mogę oczekiwać, że większość kart graficznych będzie obsługiwać np. Tekstury 4096 x 4096 (a może nawet większe)?

Przechodząc do drugiego punktu (mam nadzieję, że nadal liczy się to jako jedno pytanie, ale zasadniczo sprowadza się do tego samego problemu): czy tekstury powinny mieć wielkość 2 (256 x 256, 512 x 512, 1024 x 1024, 2048 x 2048, ..) i powinny Padam spakowane tekstury mniejsze niż to do następnej potęgi 2? Zgodnie z tym pytaniem z 2011 roku nie jest to wymóg, ale może poprawić wydajność i uniknąć drobnych błędów, a ten z 2012 roku mówi, że zdecydowanie powinieneś uzupełnić tekstury. Zdaję sobie więc sprawę, że pytania te zostały zadane wcześniej, ale są rozsądnie datowane, aby odpowiedzi uległy zmianie, a ponadto każde z nich tylko częściowo odpowiada na moje pytanie. Jak inne projekty / radzą sobie z tym?

TL; DR: Jakich rozmiarów tekstur mogę się spodziewać w przypadku większości kart graficznych? Jakie są optymalne rozmiary tekstur (lub są)? Czy należy uzupełnić szerokość tekstur do następnej potęgi 2?

flotothemoon
źródło
4
Procesor graficzny obsługuje tylko potęgi 2. Jeśli nie wypełnisz ręcznie tekstur, procesor GPU (lub wybrany silnik gry) zrobi to za Ciebie, co spowoduje niewielkie opóźnienie w czasie wykonywania dla poszczególnych tekstur, które mogą się sumować. Nie mogę jednak zaoferować żadnej pomocy dotyczącej maksymalnych / optymalnych rozmiarów tekstur.
ketura
@ketura Ah rozumiem, dziękuję. Powiedzmy, że mam obraz o rozdzielczości 513x10. Czy byłoby szybciej wstawić go do 1024x1024, a następnie przenieść wszystkie te puste piksele lub pozwolić GPU to zrobić?
flotothemoon
4
Nie musisz iść tak wysoko. Działa 1024 x 16; nie musi to być KWADRATOWY, a jedynie siła 2 w każdym kierunku. Chociaż w takim przypadku poważnie zastanowiłbym się, czy nie mogłem oszczędzić piksela i obniżyć go do 512 x 16 lol.
ketura

Odpowiedzi:

6

Zamierzam podjąć próbę odpowiedzi, choć YMMV. Korzystam z ankiety sprzętowej Steam ( http://store.steampowered.com/hwsurvey?platform=pc ), aby ustalić, jaka jest pamięć RAM wideo (VRAM) dostępna na większości komputerów. Patrząc na wyniki z dnia 13.10.2015 (dziś), prawie 85% ludzi ma 1024 MB VRAM.

Twoje pytanie jest bardzo szerokie, ponieważ nie określa docelowego sprzętu (konsoli, komputera, urządzenia przenośnego, urządzeń mobilnych?). Będę mówić o komputerach PC i możesz ekstrapolować na inne platformy w oparciu o specyfikacje sprzętowe.

Zakładając 32 bity koloru + alfa na piksel, tj. 4 bajty na piksel, 1 GB pamięci VRAM może maksymalnie pomieścić ~ 256 milionów pikseli. Odpowiada to 256 teksturom 1K na 1K. Zakłada się (niepoprawnie), że chcesz tylko przechowywać tekstury w pamięci VRAM, podczas gdy będzie mnóstwo innych rzeczy (np. Dane siatki, jeśli pracujesz w 3D), na które musisz zostawić miejsce. Prawdopodobnie chcesz też zostawić trochę więcej miejsca na mip-mapowanie tekstur, co zwykle działa najlepiej, jeśli twoje tekstury mają potęgę dwóch.

Nowoczesne konsole (XBOX One i PS4) mają 4-8 GB zunifikowanej pamięci RAM, większość urządzeń przenośnych i urządzeń mobilnych ma 1–2 GB zunifikowanej pamięci RAM, z ograniczeniami co do ilości przydzielonej pamięci VRAM.

Zwykle tworzyłem tekstury 2K, aby działały na większości komputerów PC, umożliwiając opcję skalowania w dół dla niższych urządzeń. Jeśli piszesz grę 2D i chcesz kierować reklamy na ekrany o wyższej rozdzielczości (4K, iPad Retina itp.), Możesz użyć tekstur 4K jako tła, ale w większości innych części może to być przesada.

Mam nadzieję, że to pomogło i nie zabłociło wód.

Vijay Varadan
źródło
Dzięki za odpowiedź, zdecydowanie pomaga. Jeśli chodzi o szerokość, przepraszam za to, zapomniałem podać kilka szczegółów: Tworzę dla komputerów PC w 2D. Co się stanie, jeśli użyjesz tekstur większych niż maksymalny obsługiwany rozmiar tekstury? Czy to w ogóle nie działa, czy po prostu staje się wolniejsze?
flotothemoon
1
Wygląda na to, że moja odpowiedź była na miejscu. Sprawdzanie innych postów na forum witryny Teksty 2k powinny być obsługiwane, aby gra działała na większości urządzeń. Limit rozmiaru tekstury zależy od konkretnego sprzętu i konkretnej wersji OpenGL-ES. Nie jestem pewien, jaki byłby konkretny komunikat o błędzie, ale pochodziłby z OpenGL-ES podczas próby załadowania tekstury. Przydatne linki: answers.unity3d.com/questions/563094/... , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 i feedback.wildfiregames.com/report/opengl/feature/...
Vijay Varadan
Kiedy próbuję załadować lub powiązać teksturę? Czy to tutaj jest to samo?
flotothemoon