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?
opengl
textures
performance
Będzie
źródło
źródło
Odpowiedzi:
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:
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.
źródło
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
źródło
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.
źródło
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ą
źródło
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.
źródło