Czy powinienem używać tekstur o rozmiarze nieprzekraczającym 2?

40

Na początku OpenGL i DirectX rozmiary tekstur musiały być potęgami dwóch. Oznaczało to, że interpolacja wartości zmiennoprzecinkowych może być wykonana bardzo szybko, przy użyciu przesunięcia i tym podobnych.

Od czasu OpenGL 2.0 (i wcześniejszych, poprzez rozszerzenie) obsługiwane są nie-moc dwóch wymiarów tekstury.

Czy potęga dwóch tekstur ma przewagę wydajności na nowoczesnych zintegrowanych i dyskretnych kartach graficznych? Jakie zalety mają tekstury bez mocy dwóch?

Czy znaczna populacja komputerów stacjonarnych ma karty obsługujące tekstury inne niż potęga dwóch?

Będzie
źródło
Zobacz doskonałą odpowiedź na podobne pytanie: dlaczego obrazy tekstur na iPhonie muszą mieć moc dwóch wymiarów?
Dvole,

Odpowiedzi:

15

Czy są zalety wydajnościowe związane z trzymaniem się dwóch mocnych tekstur na nowoczesnych zintegrowanych i dyskretnych kartach graficznych?

Większość współczesnych układów GPU obsługuje brak zasilania dwóch tekstur (NPOT) i radzi sobie z nimi dobrze. Spadek wydajności jest niewielki. Ale jest kilka problemów do rozważenia:

  • Podczas korzystania z tekstury NPOT zajmuje więcej miejsca w pamięci RAM, podobnie jak tekstury POT następnej wielkości. Technicznie po prostu marnujesz przestrzeń, którą można by wykorzystać, aby coś tam umieścić;

  • Tekstury NPOT mogą być przetwarzane zauważalnie wolniej (w OpenGL 2.1 miałem spadek wydajności nawet o 30%) w porównaniu do POT następnego rozmiaru;

  • Starsze GPU i GPU na pokładzie / na chipie nie są tak zaawansowane, często obsługują tekstury NPOT, ale obsługa jest dość powolna i niezdarna;

  • Nawet starsze procesory graficzne mogą w ogóle nie akceptować / wyświetlać tekstur NPOT;

  • Mogą występować artefakty krawędziowe spowodowane interpolacją mip-map, twoja tekstura 25x25 może mieć czarną obwódkę, do której dodano piksele, aby upchnąć ją do rozmiaru 32x32.

PS Nie wiem na pewno na temat urządzeń mobilnych, mogą istnieć jeszcze większe ograniczenia dotyczące tekstur POT.

Jakie zalety mają ewentualne tekstury inne niż potęga dwóch?

O ile mi wiadomo, są tylko 2 zalety:

  • Zajmują mniej miejsca na dysku twardym, jeśli nie są zapakowane (po zapakowaniu puste obszary dają bardzo mało dodatków)
  • Możesz zaoszczędzić czas na pisaniu konwertera NPOT -> POT. Będziesz potrzebował jednego do wersji, ale używanie tekstur NPOT do projektowania i prototypowania interfejsu / modeli jest w porządku

Czy są duże populacje użytkowników komputerów stacjonarnych, którzy nie mają kart obsługujących tekstury inne niż potęga dwóch?

O ile wiem i przetestowałem na PC - Tak. Obejmuje to znaczny odsetek procesorów graficznych zmniejszających prędkość / drobne błędy i niewielki procent kart, które w ogóle nie obsługują NPOT.

Kromster mówi, że popiera Monikę
źródło
6

Jednym z powszechnych zastosowań tekstur bez mocy dwóch jest renderowanie tekstur docelowych używanych w efektach przetwarzania końcowego w „wielkości ekranu” lub „wielkości połowy ekranu” (i tak dalej).

W takich przypadkach mipmapy nie są potrzebne, bufor jest zawsze nieskompresowany, więc nieparzyste rozmiary tekstur powodują tutaj mniej problemów

bluescrn
źródło
4

Istnieją ograniczenia dotyczące tekstur NPOT na starszym sprzęcie. Jak wspomniano na tej wiki OpenGL , niektóre starsze urządzenia wymagają, aby NPOT nie posiadały mipmap, skompresowane tekstury wymagają wyrównania 4x4 pikseli, ale nowy sprzęt powinien sobie z tym poradzić doskonale.

Z mojego doświadczenia wynika, że ​​nawet stosunkowo nowy sprzęt ma duży wpływ na wydajność, jeśli używasz tekstur NPOT zamiast POT. Nie wiem o co chodzi; możliwe jest, że w niektórych kombinacjach stanów renderowania renderowanie odbywa się w oprogramowaniu. Tak więc, chyba że masz uzasadnione powody, zalecałbym nadal używanie POT w jak największym stopniu.

Dlaczego warto używać NPOT zamiast POT - jeśli masz obrazy o wymiarach NPOT, powiedzmy na przykład 1600 x 1200, użycie powierzchni 2048 x 2048 pikseli spowoduje marnowanie dużej ilości pamięci wideo.

Jari Komppa
źródło
3
Jeśli używasz formatów tekstur skompresowanych w pamięci (na przykład PVR lub DXT), skalowanie do następnej potęgi dwóch spowoduje użycie znacznie mniejszej ilości pamięci tekstury niż nieskompresowana, ale mniejsza tekstura NPOT.
Tetrad
3
Twoje sformułowanie jest trochę niejasne, więc przepraszam, jeśli jest to zbędne z tym, co próbujesz powiedzieć - skompresowane tekstury nadal wymagają rozmiarów pikseli w wielokrotnościach 4, nawet na nowoczesnym sprzęcie obsługującym tekstury NPOT.
1
Spodziewałbym się, że obecny sprzęt nadal będzie kafelkować / zamieniać tekstury w sterownikach podczas ich przesyłania. Zmienia to układ tekstury, aby dostęp był bardziej optymalny dla sprzętu. Konsole (nie uwzględniam w tym XNA) wymagają ręcznego wykonania optymalizacji układu we własnym łańcuchu narzędzi, jestem pewien, że działają tylko na POW2.
Roger Perkins
-1

moc 2 tekstur zwiększa wydajność o około 30% dla każdego rodzaju GPU, nie tylko starych GPU (30% szybsza jest różnica między GPU wysokiej klasy a średnią), pobierają o 30% więcej pamięci RAM, ale potrzeba mniej vram, zwiększają jakość o zapewnienie odpowiedniego rozmiaru tekstury dla określonej odległości działa jak wygładzanie tekstur artefakt ciemnej linii powinien być obsługiwany przez silniki gier, a silniki aaa dobrze sobie z nimi radzą

yusef ghatavi
źródło
Zapewnia to tylko (już określoną) zaletę potęgi dwóch tekstur, nie rozwiązuje samego pytania, dlatego użyłbyś tekstur innych niż potęga z uwagi na powyższe zalety.
Josh
przepraszam, źle zrozumiałem pytanie, na mocy 2 jesteś ograniczony do 2048, 1024, 512 itd. prawdopodobnie to jest główny powód
yusef ghatavi
również brak potęgi 2 jest przydatny dla tekstur, które nie wymagają mipmap, takich jak tekstury GUI i tekstury dla postaci pierwszoosobowej, która zawsze jest blisko aparatu
yusef ghatavi
-3

Moja grafika programistyczna ma tylko odpowiedni rozmiar.

Z pewnością upraszcza moją logikę wyświetlania, wiedząc, że jeśli chcę ustawić teksturę w lewym górnym rogu ekranu, mogę po prostu ustawić 0,0 jako lewy górny teksturę i zobaczyć całą teksturę w odpowiednim miejscu, podczas gdy gdybym musiał dodać wypełnienie 0alfa, ustawianie tekstury względem krawędzi ekranu byłoby bardziej skomplikowane. Plus, oczywiście, że 0alfa wciąż musi być mieszane alfa, a jeśli patrzę na nieprzezroczyste tekstury, wolę nie mieć kanału alfa.

DeadMG
źródło
6
Zwykle na ekranie ustawia się wielokąty, a nie tekstury. Wieloboki mogą mieć dowolne potrzebne promieniowanie UV - niekoniecznie muszą one zmieniać się od 0 do 1; jeśli twoja tekstura ma tylko 30 szerokości, możesz przejść do 0,9375 (co jest kolejnym powodem, dla którego tekstury POT są dobre - UV są dokładnie reprezentowalne).