Wyobraźmy sobie dużą siatkę siatki, taką jak ta, której moglibyśmy użyć w terenie. Będziemy renderować jego n
trójkąty, obejmujące na przykład połowę naszego ekranu 1080p, w jednym losowaniu.
Jeśli spawamy wszystkie nasze wierzchołki i nie mamy szwów wygładzających / teksturujących, to każdy trójkąt ma 3 wierzchołki, a każdy wierzchołek jest wspólny dla 6 trójkątów, więc mamy n/2
wierzchołki.
Aby to zrobić, musimy:
Uruchom moduł cieniujący wierzchołki przynajmniej n/2
raz
(„przynajmniej”, ponieważ nasza pamięć podręczna dla wyników wierzchołków jest tylko tak duża. Czasami skończymy eksmitacją wierzchołka, który już przekształciliśmy, a następnie potrzebujemy go ponownie dla późniejszego trójkąta, który go dzieli, i dlatego ponownie uruchom na nim moduł cieniujący wierzchołek Tak więc nie uzyskujemy tak dużych oszczędności, jak to wygląda na papierze)
n
Trójkąty Clip & Cull .
Rasteryzuj i interpoluj co najmniej 1920x1080 / 2 lub około 1 miliona pikseli bufora ramki (ponieważ powiedzieliśmy, że nasz teren obejmuje około połowy ekranu).
(„przynajmniej” ze względu na sposób, w jaki GPU działają na poczwórnych pikselach , niektóre fragmenty tuż poza krawędziami wielokątów są nadal rasteryzowane, ale następnie maskowane, co oznacza, że przetwarzamy fragmenty dwa razy. W przypadku nierównej siatki otrzymamy również overdraw gdziekolwiek zamyka się, jeśli nie mamy szczęścia, aby najpierw narysować wielokąt z przodu do bufora głębokości)
Uruchom moduł cieniujący fragmenty dla wszystkich> = 1 milion fragmentów.
Połącz ~ 1 milion wyników z buforami ramki i głębokości.
Okej, teraz rozwińmy wszystkie nasze wierzchołki, więc teraz mamy 3n
do renderowania wierzchołki, sześć razy więcej niż wcześniej! Nasze kroki to ...
Uruchom 3n
czasy cieniowania wierzchołków .
(Brak gwiazdek z powodu buforowania, ponieważ każdy wierzchołek jest używany tylko raz, ale to oznacza, że pamięć podręczna nie może nas uratować w żadnym momencie)
n
Trójkąty Clip & Cull .
Rasteryzuj i interpoluj co najmniej 1920 x 1080/2 lub około 1 miliona pikseli bufora ramki.
Uruchom moduł cieniujący fragmenty dla wszystkich> = 1 milion fragmentów.
Połącz ~ 1 milion wyników z buforami ramki i głębokości.
... czekaj, każdy krok oprócz pierwszego jest taki sam! Dlatego większość pracy wykonywanej przez GPU w typowym wywołaniu losowania nie jest bezpośrednio związana z liczbą użytych wierzchołków. Zasięg ekranu, overdraw i całkowita liczba trójkątów stanowią znacznie więcej kosztów.
To nie znaczy, że wierzchołki są całkowicie wolne. Jeśli dzielisz wierzchołki, kiedy możesz, możesz uzyskać skromne oszczędności z buforowania, szczególnie jeśli twoje shadery wierzchołków są skomplikowane lub potok wierzchołków twojego sprzętu jest słaby (jak miało to miejsce w niektórych starszych konsolach). Ale biorąc pod uwagę, że liczba wierzchołków śledzi proporcjonalnie do liczby trójkątów plus lub minus stały współczynnik, zwykle nie jest to tak interesująca metryka całkowitego kosztu siatki.