Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przykład PRTDemo i symulator PRTCmdLine zawarte w zestawie SDK DirectX reprezentują wektory transferu w wierzchołkach siatki. Aby dokładnie odwzorować sygnał PRT, może wymagać to teselacji, które są niepraktyczne dla współczesnych gier. Reprezentacja wektorów transferu w mapach tekstur jest alternatywnym podejściem, które ma ten sam koszt danych niezależnie od złożoności siatki. Istnieje kilka sposobów generowania map tekstur wektorów transferu przy użyciu biblioteki PRT D3DX.
Wstępne obliczanie wektorów transferu
Jednym z podejść byłoby zmodyfikowanie próbek PRTDemo i PRTCmdLine w celu obliczenia wektora transferu na każdym texel w parametryzacji powierzchni. W tym celu:
- Zmodyfikuj wywołanie D3DXCreatePRTEngine, aby wyodrębnić współrzędne tekstury z siatki (ExtractUVs musi być TRUE).
- Zastąp wywołania D3DXCreatePRTBuffer wywołaniami D3DXCreatePRTBufferTex przy użyciu tego samego rozmiaru tekstury.
Wszystkie metody ID3DXPRTEngine współpracują z symulacjami per-texel z wyjątkiem: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS i ComputeDirectLightingSHAdaptive. Podczas gdy symulacja tekstury przestrzeni generuje prawidłowy wynik, często może być dość powolny, ponieważ najprawdopodobniej będzie to przetwarzanie wektorów transferowych o wysokiej gęstości.
Innym podejściem jest obliczenie adaptacyjnej symulacji PRT wierzchołka (ze współrzędnymi tekstury, które będą używane dla danych per-texel), a następnie wywołanie ID3DXPRTEngine::ResampleBuffer (przy użyciu buforu wyjściowego utworzonego przy użyciu D3DXCreatePRTBufferTex w odpowiedniej rozdzielczości). To działa ze wszystkimi funkcjonalnościami PRT D3DX w zestawie SDK i często może być znacznie wydajniejsze niż bezpośrednie obliczanie buforu transferu dla poszczególnych texeli.
Obliczenia środowiska uruchomieniowego
Jeśli jest używany pojedynczy klaster, wyniki mogą być filtrowane i mapowane mip jak każda inna tekstura, a shader pikseli jest identyczny z kodem shadera wierzchołków dostarczanym z PRTDemo.
Jeśli kompresja generuje wiele klastrów, nie można filtrować ani mipmapować danych, ponieważ indeksy klastrowania nie są ciągłe. Oto kilka alternatyw do obsługi danych wieloklasowych:
- Przeprowadź całe filtrowanie samodzielnie w cieniowaniu pikseli. Niestety, jest to ogólnie niepraktyczne ze względu na wydajność.
- Jeśli tekstury są o niskiej rozdzielczości i nie-mip-mapowane (tj. mapy światła), najprawdopodobniej bardziej efektywne będzie obliczenie oświetlenia bezpośrednio w przestrzeni tekstur, gdzie nie wystąpi filtrowanie, a następnie renderowanie obiektu z zacienioną teksturą. Jest to zasadniczo dynamiczna mapa światła, która jest tworzona w całości na procesorze GPU.
- Jeśli używany jest atlas tekstur (zobacz Using UVAtlas (Direct3D 9)), możesz ręcznie klastrować scenę, umieszczając wszystkie wektory transferu w połączonym składniku w przestrzeni tekstury w tym samym klastrze. W ten sposób można filtrować teksturę, ponieważ wszystkie teiwele dostępne byłyby w tym samym klastrze zgodnie z konstrukcją. Identyfikator klastra dla danej twarzy można propagować z cieniowania wierzchołków.
Cieniowanie pikseli ma znacznie mniej rejestrów stałych, których nie można indeksować, więc cieniowanie pikseli różni się nieco od cieniowania wierzchołka. Przechowywanie pracy dla klastra w teksturze dynamicznej o niskiej rozdzielczości i używanie obciążeń tekstur byłoby najbardziej efektywnym sposobem renderowania w przypadku korzystania z wielu klastrów.
Tematy pokrewne