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.
Cieniowania wierzchołków i cieniowania pikseli są znacznie uproszczone w przypadku wcześniejszych wersji cieniowania. W przypadku implementowania cieniowania na sprzęcie nie można używać vs_3_0 ani ps_3_0 z innymi wersjami cieniowania i nie można użyć żadnego typu cieniowania z potokiem funkcji stałych. Te zmiany umożliwiają uproszczenie sterowników i środowiska uruchomieniowego. Jedynym wyjątkiem jest to, że cieniowania tylko programowe vs_3_0 mogą być używane z dowolną wersją cieniowania pikseli. Ponadto, jeśli używasz cieniowania tylko programowego vs_3_0 z poprzednią wersją cieniowania pikseli, cieniowanie wierzchołków może używać tylko semantyki danych wyjściowych, które są zgodne z kodami elastycznego formatu wierzchołka (FVF).
Semantyka używana w danych wyjściowych cieniowania wierzchołków musi być używana w danych wejściowych cieniowania pikseli. Semantyka służy do mapowania danych wyjściowych cieniowania wierzchołków na dane wejściowe cieniowania pikseli, podobnie jak w przypadku mapowania deklaracji wierzchołka na rejestry wejściowe cieniowania wierzchołków i poprzednie modele cieniowania. Zobacz Match Semantics on vs 3.0 and ps 3.0 Shaders (Match Semantics on vs 3.0 i ps 3.0 Shaders).
Dodano dodatkowe stany renderowania trybu zawijania w celu pokrycia możliwości dodatkowych współrzędnych tekstury w tym nowym schemacie. Atrybuty z indeksem D3DDECLUSAGE_TEXCOORD i użycia z zakresu od 0 do 15 są interpolowane w trybie zawijania po ustawieniu odpowiedniego D3DRS_WRAP*.
- Funkcje Model cieniowania wierzchołków 3
- Funkcje Pixel Shader Model 3
- Match Semantics on vs_3_0 and ps_3_0 Shaders
- zmiany w trybie mgły, głębokości i cieniowania
- konwersje zmiennoprzecinkowe i całkowite
- określanie pełnej lub częściowej precyzji
- programowych wierzchołków i cieniowania pikseli
Funkcje modelu cieniowania wierzchołków 3
Typy rejestrów wyjściowych cieniowania wierzchołków zostały zwinięte do dwunastu rejestrów (zobacz Rejestry wyjściowe). Każdy używany rejestr musi być zadeklarowany przy użyciu instrukcji dcl i semantyki (na przykład dcl_color0 o0.xyzw).
Model cieniowania wierzchołków 3_0 (vs_3_0) rozszerza funkcje vs_2_0 z bardziej zaawansowanym indeksowaniem rejestru, zestawem uproszczonych rejestrów wyjściowych, możliwością próbkowania tekstury w cieniowaniu wierzchołków oraz możliwością kontrolowania szybkości inicjowania danych wejściowych cieniowania.
Indeksowanie dowolnego rejestru
Wszystkie rejestry( rejestr danych wejściowych i rejestry wyjściowe ) mogą być indeksowane przy użyciu rejestru licznika pętli (tylko rejestry stałe mogą być indeksowane we wcześniejszych wersjach).
Przed ich indeksowaniem należy zadeklarować rejestry wejściowe i wyjściowe. Jednak nie można indeksowania żadnych rejestrów wyjściowych, które zostały zadeklarowane z semantyczną pozycją lub rozmiarem punktu. W rzeczywistości, jeśli indeksowanie jest używane pozycja i semantyka psize muszą być zadeklarowane odpowiednio w rejestrach o0 i o1.
Można indeksować tylko ciągły zakres rejestrów; oznacza to, że nie można indeksowania w rejestrach, które nie zostały zadeklarowane. Chociaż to ograniczenie może być niewygodne, pozwala to na optymalizację sprzętu. Próba indeksowania w rejestrach nieciągłych spowoduje wygenerowanie niezdefiniowanych wyników. Sprawdzanie poprawności cieniowania nie wymusza tego ograniczenia.
Uproszczenie rejestrów wyjściowych
Wszystkie typy rejestrów wyjściowych zostały zwinięte do dwunastu rejestrów wyjściowych: 1 dla pozycji, 2 dla koloru, 8 dla tekstury i 1 dla mgły lub rozmiaru punktu. Te rejestry będą interpolować wszystkie dane, które zawierają dla cieniowania pikseli. Deklaracje rejestru wyjściowego są wymagane, a semantyka jest przypisywana do każdego rejestru.
Rejestry można podzielić w następujący sposób:
- Co najmniej jeden rejestr musi być zadeklarowany jako rejestr czteroskładnikowy. Jest to jedyny rejestr cieniowania wierzchołków, który jest wymagany.
- Pierwsze dziesięć rejestrów używanych przez cieniator może używać maksymalnie czterech składników (xyzw).
- Ostatni (lub dwunasty) rejestr może zawierać tylko skalarny (na przykład rozmiar punktu).
Aby uzyskać listę rejestrów, zobacz Registers — vs_3_0.
Próbka tekstury w cieniowania wierzchołków
Cieniowanie wierzchołków 3_0 obsługuje wyszukiwanie tekstur w cieniowania wierzchołków przy użyciu texldl — vs.
Funkcje modelu cieniowania pikseli 3
Cieniowanie pikseli i rejestry tekstur zostały zwinięte do dziesięciu rejestrów wejściowych (zobacz Typy rejestrów wejściowych). Rejestr twarzy jest rejestrem skalarnym zmiennoprzecinkowa. Tylko znak tego rejestru jest prawidłowy. Jeśli znak jest ujemny, pierwotny jest twarzą pleców. Można go użyć wewnątrz cieniowania pikseli, aby uzyskać na przykład dwustronne oświetlenie. Rejestr pozycji odwołuje się do bieżących (x,y) pikseli.
Rejestry stałe cieniowania można ustawić przy użyciu:
Dopasowywanie semantyki vs_3_0 i cieniowania ps_3_0
Istnieją pewne ograniczenia dotyczące użycia semantycznego z vs_3_0 i ps_3_0. Ogólnie rzecz biorąc, należy zachować ostrożność podczas korzystania z semantyki dla danych wejściowych cieniowania pasujących do semantyki używanej w danych wyjściowych cieniowania.
Na przykład ten moduł cieniowania pikseli pakuje wiele nazw do jednego rejestru:
ps_3_0
dcl_texcoord0 v0.x
dcl_texcoord1 v0.yz // Valid to pack multiple names into one register
dcl_texcoord2_centroid v1.w
...
Każdy rejestr ma inny semantyczny. Zwróć uwagę, że można również nazwać wersje v0.x i v0.yz różnymi semantykami (wieloma) ze względu na użycie maski zapisu.
Biorąc pod uwagę cieniowanie pikseli, nie można sparować z nim następującego cieniowania vs_3_0:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o6.yzw
...
Te dwa cieniowania powodują konflikt z użyciem semantyki D3DDECLUSAGE_TEXCOORD0 And D3DDECLUSAGE_TEXCOORD1.
Zastąp ponownie cieniator wierzchołków w następujący sposób, aby uniknąć kolizji semantycznej:
vs_3_0
...
dcl_texcoord2 o3
dcl_texcoord3 o9
...
Podobnie semantyczna nazwa zadeklarowana w różnych rejestrach wejściowych w cieniatorze pikseli (v0 i v1 w cieniatorze pikseli) nie może być używana w pojedynczym rejestrze danych wyjściowych w tym cieniu wierzchołka. Na przykład nie można sparować tego cieniowania wierzchołków z cieniatorem pikseli, ponieważ D3DDECLUSAGE_TEXCOORD1 jest używany dla rejestrów wejściowych cieniowania pikseli (v0, v1) i cieniowania wierzchołków rejestru o3.
vs_3_0
...
dcl_texcoord0 o3.x
dcl_texcoord1 o3.yz
dcl_texcoord2 o3.w // BAD! Would be valid if this were not o3
dcl_texcoord3 o9 ...
Z drugiej strony tego cieniowania wierzchołków nie można sparować z cieniatorem pikseli, ponieważ maska wyjściowa dla parametru z danym semantykiem nie dostarcza danych żądanych przez cieniowanie pikseli:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord2 o7.yz // BAD! Would be valid if w were included
dcl_texcoord3 o9
...
Ten cieniowanie wierzchołków nie dostarcza danych wyjściowych z jedną z semantycznych nazw żądanych przez cieniowanie pikseli, więc parowanie cieniowania jest nieprawidłowe:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord3 o9
// The pixel shader wants texcoord2, with a w component,
// but it isn't output by this vertex shader at all!
...
Zmiany w trybie mgły, głębokości i cieniowania
Gdy D3DRS_SHADEMODE jest ustawiona na płaskie cieniowanie podczas wycinania i rasteryzacji trójkątów, atrybuty z D3DDECLUSAGE_COLOR są interpolowane jako płaskie cieniowane. Jeśli jakiekolwiek składniki rejestru są deklarowane przy użyciu semantyki kolorów, ale inne składniki tego samego rejestru mają różne semantyki, płaskie cieniowanie interpolacji (liniowe a płaskie) będzie niezdefiniowane na składnikach w tym rejestrze bez semantyki kolorów.
Jeśli wymagane jest renderowanie mgły, vs_3_0 i ps_3_0 cieniowania muszą implementować mgłę. Żadne obliczenia mgły nie są wykonywane poza cieniowaniami. Nie ma rejestru mgły w vs_3_0, a dodatkowe semantyki D3DDECLUSAGE_FOG (dla współczynnika mieszanki mgły obliczonego na wierzchołek) i D3DDECLUSAGE_DEPTH (w celu przekazania wartości głębokości do cieniowania pikseli w celu obliczenia współczynnika mieszania mgły) zostały dodane.
Stan etapu tekstury D3DTSS_TEXCOORDINDEX jest ignorowany podczas korzystania z cieniowania pikseli 3.0.
Dodano następujące wartości w celu uwzględnienia tych zmian:
// Fog and Depth usages
D3DDECLUSAGE_FOG
D3DDECLUSAGE_DEPTH
// Additional wrap states for vs_3_0 attributes with D3DDECLUSAGE_TEXCOORD
D3DRS_WRAP8
D3DRS_WRAP9
D3DRS_WRAP10
D3DRS_WRAP11
D3DRS_WRAP12
D3DRS_WRAP13
D3DRS_WRAP14
D3DRS_WRAP15
Konwersje zmiennoprzecinkowe i całkowite
Matematyka zmiennoprzecinkowa ma różną precyzję i zakresy (16-bitowe, 24-bitowe i 32-bitowe) w różnych częściach potoku. Wartość większa niż dynamiczny zakres potoku, który wprowadza ten potok (na przykład 32-bitowa mapa tekstur zmiennoprzecinkowych jest próbkowana do 24-bitowego potoku zmiennoprzecinkowego w ps_2_0) tworzy niezdefiniowany wynik. W przypadku przewidywalnego zachowania należy zacisać taką wartość do maksymalnego zakresu dynamicznego.
Konwersja z wartości zmiennoprzecinkowej na liczbę całkowitą odbywa się w kilku miejscach, takich jak:
- W przypadku napotkania instrukcji mova — a.
- Podczas adresowania tekstury.
- Podczas zapisywania w obiekcie docelowym renderowania nieprzecinkowego.
Określanie pełnej lub częściowej precyzji
Zarówno ps_3_0, jak i ps_2_x zapewniają obsługę dwóch poziomów precyzji:
| ps_3_0 | ps_2_0 | Precyzja | Wartość |
|---|---|---|---|
| x | Pełny | fp32 lub nowszy | |
| x | Precyzja częściowa | fp16=s10e5 | |
| x | x | Pełny | fp24=s16e7 lub nowszy |
| x | x | Precyzja częściowa | fp16=s10e5 |
ps_3_0 obsługuje większą precyzję niż ps_2_0. Domyślnie wszystkie operacje są wykonywane na poziomie pełnej precyzji.
Częściowa precyzja (zobacz modyfikatory rejestru cieniowania pikseli) jest żądana przez dodanie modyfikatora _pp do kodu cieniowania (pod warunkiem, że podstawowa implementacja go obsługuje). Implementacje są zawsze bezpłatne, aby ignorować modyfikator i wykonywać operacje, których dotyczy problem, w pełnej precyzji.
Modyfikator _pp może wystąpić w dwóch kontekstach:
- Na deklaracji współrzędnych tekstury w celu przekazania współrzędnych tekstury częściowej precyzji do cieniowania pikseli. Może to być używane, gdy współrzędne tekstury przekazują dane kolorów do cieniowania pikseli, co może być szybsze z częściową precyzją niż z pełną precyzją w niektórych implementacjach.
- Na dowolnej instrukcji, aby zażądać użycia częściowej precyzji, w tym instrukcji ładowania tekstury. Oznacza to, że implementacja może wykonać instrukcję z częściową precyzją i zapisać wynik częściowej precyzji. W przypadku braku jawnego modyfikatora instrukcja musi być wykonywana z pełną precyzją (niezależnie od precyzji operandów wejściowych).
Aplikacja może celowo zdecydować się na kompromis z dokładnością do wydajności. Istnieje kilka rodzajów danych wejściowych cieniowania, które są naturalnymi kandydatami do częściowego przetwarzania precyzyjnego:
- Iteratory kolorów są dobrze reprezentowane przez wartości częściowej precyzji.
- Wartości tekstur z większości formatów mogą być dokładnie reprezentowane przez wartości częściowej precyzji (wartości próbkowane z 32-bitowych tekstur formatu zmiennoprzecinkowego są oczywistym wyjątkiem).
- Stałe mogą być reprezentowane przez reprezentację częściowej precyzji odpowiednio do cieniowania.
We wszystkich tych przypadkach deweloper może zdecydować się na określenie częściowej precyzji przetwarzania danych, wiedząc, że żadna precyzja danych wejściowych nie zostanie utracona. W niektórych przypadkach cieniowanie może wymagać wykonania wewnętrznych kroków obliczenia z pełną precyzją, nawet jeśli wartości wejściowe i końcowe wyjściowe nie mają większej niż częściowej precyzji.
Cieniowanie wierzchołków oprogramowania i pikseli
Implementacje oprogramowania (czas wykonywania i odwołanie do cieniowania wierzchołków i odwołania do cieniowania pikseli) w wersji 2_0 cieniowania i powyżej mają pewne złagodzenie walidacji. Jest to przydatne do celów debugowania i tworzenia prototypów. Aplikacja wskazuje środowisko uruchomieniowe/asemblera, że potrzebuje części weryfikacji złagodzonej przy użyciu flagi _sw w asemblerze (na przykład vs_2_sw). Cieniowania oprogramowania nie będzie działać ze sprzętem.
vs_2_sw to relaks maksymalne limity vs_2_x; podobnie, ps_2_sw jest relaksem do maksymalnych limitów ps_2_x. W szczególności następujące weryfikacje są złagodzone:
| Model cieniowania | Zasób | Ograniczać |
|---|---|---|
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Liczby instrukcji | Nieograniczony |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Rejestry stałe zmiennoprzecinkowe | 8192 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Rejestry stałe liczby całkowitej | 2048 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Rejestry stałe logiczne | 2048 |
| ps_2_sw | Głębokość odczytu zależnego | Nieograniczony |
| vs_2_sw | instrukcje i etykiety sterowania przepływem | Nieograniczony |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Pętla start/krok/liczniki | Rozmiar kroku rozpoczęcia i iteracji dla instrukcji powtórzeń i pętli to 32-bitowe liczby całkowite ze znakiem. Liczba może być maksymalnie MAX_INT/64. |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Limity portów | Limity portów dla wszystkich plików rejestru są złagodzone. |
| vs_3_sw | Liczba interpolatorów | 16 rejestrów wyjściowych w vs_3_sw. |
| ps_3_sw | Liczba interpolatorów | 14(16-2) rejestry wejściowe dla ps_3_sw. |
Tematy pokrewne
-
model cieniowania 3 (DirectX HLSL)