Jak działa pamięć podręczna tekstur w GPU renderowania opartego na kafelkach

9

Jak pamięć podręczna działa z renderowaniem opartym na kafelkach?

Czy są jakieś wskazówki, jak poprawić współczynnik trafień w pamięci podręcznej? (na przykład, jeśli płytki są przetwarzane poziomo i mam pionowe segmenty trójkątów o tej samej teksturze, czy działa to gorzej dla pamięci podręcznej niż gdybym miał układ trójkątów w poziomie?)

Felipe Lira
źródło
1
Co rozumiesz przez pionowy vs poziomy układ trójkątów?
Mokosha
@Mokosha przepraszam, to jakoś mnie nie zauważyło. Właśnie to widziałem. Jest to pytanie bardziej teoretyczne niż praktyczne i nawet nie wiem, czy ma to teraz sens. W każdym razie, miałem na myśli, powiedzmy, że trójkąt przecina płytki (x, y) i (x + 1, y) i że te dwie płytki są przetwarzane jedna po drugiej. Czy byłoby lepiej dla bufora tekstur niż gdybym miał trójkąt przecinający się (x, y) i (x, y + 1)? (Ze względu na to, że piksele graniczne i układ trójkątów nie są w tym samym kierunku, co przetwarzanie płytek)
Felipe Lira

Odpowiedzi:

19

To, czy jest to układ GPU oparty na kafelkach, czy nie, tak naprawdę nie wpływa na architekturę pamięci podręcznej tekstur. Układ pamięci tekstury będzie wyglądał jak jakiś smak rzędu Mortona lub krzywej Hilberta we wszystkich procesorach graficznych.

W rezultacie bardziej wydajne jest renderowanie trójkątów zbliżonych do trójkątów równobocznych, ponieważ system pamięci GPU pobiera linie buforujące tekstur.

Oczywiście na granicach kafelków może się zdarzyć, że będziesz musiał pobrać tekstury dwa razy. Ma to niewielki koszt, ponieważ obramowania kafelków to tylko „kilka” pikseli.

Prawdopodobnie stacjonarne układy GPU zachowują się identycznie z układami GPU opartymi na kafelkach, co pokazują eksperymenty, takie jak następujące: http://www.g-truc.net/post-0597.html

Rozmiar kafelków jest różny, ale obie architektury przetwarzają fragmenty w hierarchię kafelków o różnych rozmiarach.

Przy kodowaniu układów GPU opartych na kafelkach zalecam, aby zawsze pamiętać:

  1. Nie zmieniaj obiektów bufora ramki, chyba że naprawdę potrzebujesz.
  2. Podczas wiązania nowego obiektu bufora ramki, jeśli nie musisz zapisywać zawartości bieżącego bufora ramki, odrzuć go. Jeśli nie chcesz ładować zawartości nowego bufora ramki, powinieneś wyczyścić bufor ramki.
Christophe
źródło
Zaktualizowałem drugi element, ponieważ edycja nie była tym, co miałem na myśli. W przeciwnym razie wygląda świetnie!
Christophe
Cześć Christophe, miałeś na myśli „trójkąty równoboczne”, a nie „równoramienne”? Zamiast „Hilbert” powiedziałbym zamówienie „Morton”, ponieważ adresowanie jest znacznie łatwiejsze w sprzęcie.
Simon F
@Christophe dzięki! To jest naprawdę pomocne. Czy w przypadku pikseli granicznych pamięć podręczna tekstur nie ma znaczenia? Zastanawiałem się nad tym. Tak więc, jeśli mam trójkąt, który przecina kafelki (x, y) i (x + 1, y), a GPU właśnie zrasteryzowany kafelek (x, y). Zakładając, że kafelek (x + 1, y) będzie następny, nawet jeśli przetwarzają go inne jednostki wykonawcze, czy nie skorzystam z pamięci podręcznej tekstur podczas próbkowania tekstur dla tego trójkąta?
Felipe Lira,
Również zainteresowałem się wzorem Hilberta. Zawsze zakładałem, że dotyczy to tekstur skompresowanych blokowo. Czy to prawda dla wszystkich tekstur? PS: Nie przestrzegałem również ostatniego akapitu.
Felipe Lira,
PVRTC koduje bloki tekstur w kolejności
morton