Atlas tekstur a tekstura tablic: w jaki sposób są obsługiwane przez procesor i procesor graficzny i jak wpływa to na wydajność?

10

Unity 5.4 (obecnie w fazie beta) przyniesie bardzo oczekiwaną funkcję (od 2013 r.), Czyli tekstury tablic - w tym samym próżności co ArrayTexture OpenGL . Jednak po lekturze tekstów tablic i atlasów tekstur nadal nie rozumiem technicznych różnic w ich wykorzystaniu przez procesory i procesory graficzne.

Mówiąc bardziej szczegółowo, chciałbym prosić o wyjaśnienie głównych różnic między tym, jak atlas tekstur i tablice tekstur są przetwarzane przez procesor i procesor graficzny, a co najważniejsze, w jaki sposób różnice te mogą wpływać na wydajność i obsługę pamięci (np. jak tablice tekstur mogą być bardziej wydajne niż atlasy tekstur itp.).

Jeśli brakuje szczegółów technicznych dotyczących implementacji Unity z powodu niefortunnego zamkniętego źródła, byłbym zadowolony z odpowiedzi dotyczącej ArrayTexture OpenGL.s.

ASteer
źródło
Nie zdziwiłem się, że nie znalazłeś porównania technicznego, ponieważ oba są zależne od implementacji (więcej dla tablic).
wondra
Będziesz miał trudności z uzyskaniem informacji o tym, jak funkcjonują elementy wewnętrzne silnika Unity, ponieważ jest to zamknięte źródło, czarna skrzynka. Jedyne, co możesz zrobić, to profilować każdą skrzynkę i uzyskać porównanie użycia procesora i procesora. Aby zrozumieć, jak to działa, wymaga ingerencji inżyniera Unity lub otwarcia lub wycieku kodu źródłowego.
jgallant
@Jon Fair dość, ale tak naprawdę byłem bardziej zainteresowany odpowiedzią niezależną od silnika. Jeśli tak bardzo się różni, mogę zaktualizować pytanie, aby omówić na przykład ArrayTexture OpenGL: opengl.org/wiki/Array_Texture
ASteer

Odpowiedzi:

12

Jak zauważono w powyższych komentarzach, wydajność będzie zależeć od implementacji, konkretnego sprzętu i tego, co próbujesz zrobić z teksturami, więc jedyną wiarygodną odpowiedzią jest profilowanie każdej alternatywy.

Istnieje kilka różnic w sposobie korzystania z każdej opcji, które będą obowiązywać konsekwentnie:

Jedną dużą różnicą jest to, że w przypadku tekstur tablic każdą teksturę traktuje się osobno w celach takich jak zawijanie współrzędnych tekstury lub mipmapping.

Pozwala to uniknąć typowych problemów z atlasami tekstur, w których musimy dodać wypełnienie między sąsiednimi próbkami tekstury, aby próbki nie zlewały się na ich brzegach, szczególnie w przypadku głębszych poziomów mip.

Oznacza to również, że jeśli chcesz kafelkować tekstury, możesz użyć sprzętu do próbkowania tekstury, aby zrobić to tak, jak w przypadku tekstury waniliowej. W przypadku atlasów zwykle musimy wykonywać matematykę kafelków w naszym module cieniującym fragmenty, ponieważ próbnik zawija tylko / lustra / zaciski / granice współrzędnych tekstury w całym atlasie, a nie w poszczególnych płytkach.

Głównym ograniczeniem tekstur tablicowych jest to, że wymagają, aby wszystkie składowe tekstury miały tę samą rozdzielczość i liczbę poziomów mip. Jeśli próbujesz grupować tekstury o bardzo różnych potrzebach rozdzielczości (powiedzmy, przechowywanie kafelków terenu, których LoD spada z odległością w wirtualnej teksturze ), możesz zamiast tego chcieć elastyczności atlasu.

DMGregory
źródło
Dzięki, dokładnie o to mi chodziło. Chodzi mi o to, że nie ma odpowiedzi na temat tego, który z nich jest szybszy, mniej wymagający pamięci - ponieważ oczywiście są one zależne od implementacji. Byłem jednak pewien, że niektóre wskazówki dotyczące funkcjonowania każdej sprawy mogą być przydatne do zrozumienia ich zwykłych scenariuszy najlepszego i najgorszego dopasowania. Twoja odpowiedź naprawdę mi w tym pomogła.
ASteer
Kolejna wada tekstur tablic: są one ograniczone przez GL_MAX_ARRAY_TEXTURE_LAYERS. Na moim pół-nowoczesnym GPU jest to 2048, więc jeśli chcesz mieć mnóstwo drobnych tekstur, ten limit może być zbyt niski.
jwd