Czy dobrą praktyką jest używanie wszystkich dostępnych jednostek tekstury?

9

Podczas nakładania wielu tekstur na siatkę, jak w przypadku mapowania wypukłości, zwykle wiążę tekstury z pierwszymi kilkoma stałymi jednostkami tekstury, np.: Rozproszone = jednostka 0, wypukłość = jednostka 1, lusterko = jednostka 2, a następnie ponownie wykorzystuję je dla każdego inna siatka o różnych teksturach. Ale zawsze zastanawiałem się, dlaczego glActiveTextureobsługuje tak wiele jednostek tekstur (w poprzednim linku jest co najmniej 80).

Przyszło mi do głowy, że jednym z możliwych sposobów zarządzania teksturami jest powiązanie różnych tekstur z każdą dostępną jednostką i pozostawienie ich włączonych, po prostu aktualizując jednolity indeks samplera. To powinno poprawić renderowanie perf poprzez zmniejszenie liczby przełączników tekstur. Jeśli masz mniej tekstur niż maksymalna liczba jednostek tekstur, nigdy nie musisz rozpinać tekstury.

Czy to standardowa praktyka w aplikacjach OpenGL w czasie rzeczywistym (uważam, że dotyczy to również D3D)? Czy są jakieś nieoczywiste implikacje wydajnościowe związane z takim podejściem? Być może narzut pamięci?

glampert
źródło

Odpowiedzi:

11

Współczesny sprzęt tak naprawdę nie ma koncepcji punktów wiązania tekstur ujawnionej przez OpenGL. Zamiast tego jednostka cieniująca używa deskryptora (który jest po prostu grubym wskaźnikiem), który może potencjalnie adresować dowolną teksturę, o ile pozostaje ona w pamięci wideo. To sprawia, że możliwe są takie tekstury jak niewiążące . Tak więc duża liczba „jednostek tekstur” dostępnych w bieżących implementacjach po prostu próbuje przeforsować tę nieistotną teraz część interfejsu API.

To powiedziawszy, zalecanym sposobem implementacji tego, co próbujesz zrobić (unikając ponownego wiązania tekstur), jest użycie tablic tekstur , które pozwalają dynamicznie indeksować do zestawu tekstur w module cieniującym, o ile wszystkie mają ten sam format i rozmiar. Ta prezentacja zawiera więcej szczegółów na temat tych i innych technik zmniejszania obciążenia sterownika podczas renderowania w nowoczesnym OpenGL: Podejście do zerowego obciążenia sterownika

yuriks
źródło
Oglądałem już tę prezentację, jest bardzo dobra. Nie wiedziałem jednak o tym, o czym wspomniałeś w pierwszym akapicie, więc dziękuję za te informacje!
glampert,