Zrobiłem uczciwy udział w programowaniu gier 3D dla mojego (byłego) pracodawcy, a także we własnych silnikach niestandardowych dla moich niezależnych gier.
Początkowo zacząłem od Direct3D 9 i D3DX9, które prawie wszystko dla mnie zrobiły i nie wymagały ode mnie myślenia w kategoriach shaderów.
Potem napisałem swoje pierwsze shadery Direct3D 9, ale najczęściej używałem jednego bardzo prostego shadera do wszystkiego, co zrobiłem.
W najnowszej wersji silnika gry przeniosłem się na Direct3D 11 i dzięki temu stworzyłem wiele shaderów. Zrobiłem skórowanie na GPU, cząstki obliczone na GPU, mnóstwo efektów świetlnych i przetwarzania końcowego, wszystko w GPU. Naprawdę fajne rzeczy.
Do tej pory używałem tylko shaderów wierzchołków i pikseli / fragmentów. Chociaż wciąż jest wiele rzeczy, których jeszcze nie zrobiłem, uważam, że mam solidną wiedzę na temat tego, co robią shadery wierzchołków i pikseli / fragmentów oraz jak to wszystko pasuje do całego potoku 3D.
Nadążając za nowszymi wersjami, zainteresowałem się nowszymi etapami shaderów. Oznacza to, że Shadery Geometrii, a nawet nowsze, Shadery Hull i Domain.
Nigdy nie korzystałem z tych etapów, ale z tego, co wiem, moduł cieniujący Geometria, jeśli jest włączony, jest uruchamiany po module cieniującym wierzchołków, raz dla każdego przekształconego wierzchołka (lub raz dla elementu pierwotnego?) I pozwala odrzucić wierzchołki (i elementy podstawowe?) i utwórz nowe (które, jak sądzę, wrócą do początku potoku?).
Domyślam się, że głównym zastosowaniem modułu cieniującego geometrię byłoby programowe generowanie geometrii w GPU. Częstym zastosowaniem byłoby tworzenie quadów billboardowych w oparciu o pojedynczy wierzchołek, ale tak naprawdę nie wizualizuję wielu innych typowych scenariuszy oprócz generowania fraktali i innych rzeczy, które można wygenerować w 100% programowo.
Jeśli chodzi o shadery Hull i Domain, wydaje się, że są one związane z teselacją (tworzenie gładszych powierzchni z szorstkich powierzchni?) I muszą być używane razem, czy wcale. Termin „łatka” również wydaje się tutaj powszechny.
Czy ktoś chciałby mi wyjaśnić w praktyce, do czego służą te nowe moduły cieniujące, jak pasują do potoku 3D iw jakich przypadkach powinienem rozważyć ich użycie?
źródło
Odpowiedzi:
Kadłub i domeny
Etapy kadłuba i modułu cieniującego domeny są częścią potoku teselacji GPU. Są one zwykle używane do obliczania bardzo szczegółowej geometrii powierzchni na podstawie wejściowej geometrii powierzchni o niższych szczegółach, która jest zdefiniowana jako trójkąty lub kwadraty (i tak dalej). Prymitywy wejściowe o niższych szczegółach nazywane są „łatkami” i ważne jest, aby pamiętać, że mogą nie reprezentować faktycznej geometrii , która ostatecznie będzie istnieć (chociaż mogłyby). Pomyśl bardziej o punktach kontrolnych krzywej Beziera, z wyjątkiem powierzchni.
Moduł cieniujący kadłuba pobiera łatkę wejściową i tworzy łatkę wyjściową (lub łatki; w tym miejscu na ogół występowałby podział łatki). Stałe metadane dotyczące łaty mogą być również obliczane w module cieniowania kadłuba i przetwarzane na późniejszych etapach potoku.
Sygnał wyjściowy modułu cieniującego kadłub przechodzi przez etap teselacji (z ustaloną funkcją), który wytwarza kafelkowe, znormalizowane domeny odpowiedniego typu (np. Quady lub trójkąty).
Moduł cieniujący domeny jest wykonywany w odniesieniu do tych domen w celu obliczenia rzeczywistej pozycji wierzchołka dowolnego punktu w domenie, która powstała w wyniku wspomnianej teselacji. Moduł cieniujący domeny wyprowadza zatem pozycję wierzchołka.
Faza teselacji występuje po etapie modułu cieniującego wierzchołków w potoku.
Shadery geometrii
Shadery geometrii są poniekąd jak uproszczone shadery kadłuba / domeny. Po prostu biorą wierzchołki wejściowe i wytwarzają wierzchołki wyjściowe. Dla danego wierzchołka wejściowego można utworzyć wiele wierzchołków wyjściowych, więc można ich użyć do „wygenerowania geometrii”.
Etap modułu cieniującego geometria występuje po module cieniującym wierzchołków i po etapie teselacji.
Używa
Moduł cieniujący geometrię może zapisywać do wyjściowych buforów strumieniowych zamiast być wprowadzany bezpośrednio do fazy rasteryzacji i cieniowania fragmentów rurociągu; oznacza to, że możesz ponownie uruchomić geometrię utworzoną przez połączenie iteracji wierzchołka / kadłuba / domeny / geometrii z powrotem przez potok, aby wykonać dodatkową pracę na innym etapie modułu cieniującego wierzchołków lub cokolwiek innego.
Co można z nich korzystać za to dość szeroka, skutecznie-nieograniczony temat, więc nie będę naprawdę próbować tego adresu. Ale jeśli chodzi o niektóre motywujące powody, aby rozważyć ich użycie ... Najważniejsze w tych stopniach cieniowania jest to, że pozwalają one uzyskać całkiem sporo dodatkowych szczegółów bez ponoszenia kosztów pamięci i przepustowości przez cały czas. A także przenieść przetwarzanie z procesora na GPU.
Teren jest dobrym przykładem tego, gdzie możesz chcieć skorzystać z niektórych z tej technologii, ponieważ na ogół musisz zobaczyć ją zarówno bardzo blisko (ponieważ stoi na niej twoja postać), jak i bardzo daleko (góry w oddali) i będąc w stanie kontrola miejsca i ilości szczegółów wprowadzanych do geometrii terenu „w locie” za pomocą tych stopni shadera jest bardzo potężna. Alternatywnie w przeszłości przez cały czas płacono stały średni koszt terenu (podejście o najniższym wspólnym mianowniku) lub ręcznie stronicowano fragmenty geometrii dla różnych poziomów szczegółowości w pamięci GPU i poza nią, co jest żmudne i kosztowny.
Każda podobna sytuacja, w której możesz mieć naprawdę szeroki zakres szczegółowości, który musisz obsługiwać dla niektórych siatek lub modeli, który jest również dość podzielny, może być kandydatem do zrobienia czegoś sprytnego z tymi modułami cieniującymi. Jednak nie wszystko dobrze przekłada się na optymalizację stylu powierzchni działowej. Prawdopodobnie możesz ich użyć również do ubrań i włosów.
Do dalszej lektury, zawierającej znacznie więcej szczegółów, niż mogę rozsądnie zapamiętać lub wejść tutaj:
źródło