wzornik Two-Sided (Direct3D 9)
Woluminy w tle są używane do rysowania cieni z buforem wzornika. Aplikacja oblicza woluminy w tle rzutowane przez geometrię okludium, obliczając krawędzie sylwetki i wytłaczając je z dala od światła do zestawu woluminów 3D. Te woluminy są następnie renderowane dwa razy w buforze wzornika.
Pierwsze renderowanie rysuje wielokąty skierowane do przodu i zwiększa wartości buforu wzornika. Drugi renderowanie pobiera wielokąty z tyłu woluminu w tle i dekrementuje wartości buforu wzornika. Zwykle wszystkie wartości przyrostowe i dekrementowane anulują się nawzajem. Jednak scena została już renderowana z normalną geometrią powodującą niepowodzenie testu bufora Z w miarę renderowania woluminu w tle. Wartości pozostawione w buforze wzornika odpowiadają pikselom, które znajdują się w cieniu. Te pozostałe zawartości wzornika-bufora są używane jako maska, aby alfa-blend duży, obejmujący czworokąt w scenie. Dzięki buforowi wzornika działającemu jako maska wynik polega na ciemnieniu pikseli, które znajdują się w cieniu.
Oznacza to, że geometria cienia jest rysowana dwa razy na źródło światła, dlatego wywiera presję na przepływność wierzchołka procesora GPU. Funkcja wzornika dwustronna została zaprojektowana w celu złagodzenia tej sytuacji. W tym podejściu istnieją dwa zestawy stanu wzornika (o nazwie poniżej), jeden ustawiony dla trójkątów przednich, a drugi dla trójkątów skierowanych z tyłu. W ten sposób tylko jedno przejście jest rysowane na wolumin cienia, na światło.
Zmiany interfejsu API są ograniczone do nowego zestawu stanów renderowania. Nowy D3DRS_Two_Sided_StencilMODE stanu renderowania można ustawić na wartość true lub FALSE. Domyślnie jest to FALSE, co oznacza bieżące zachowanie (DirectX 8). Po ustawieniu wartości true (będzie działać tylko wtedy, gdy D3DSTENCILCAPS_TWOSIDED jest ustawiona), następujące stany renderowania będą miały zastosowanie tylko do trójkątów skierowanych do przodu (zgodnie z ruchem wskazówek zegara).
Stan renderowania | Opis |
---|---|
D3DRS_STENCILFAIL | D3DSTENCILOP zrobić, jeśli test wzornika zakończy się niepowodzeniem. |
D3DRS_STENCILZFAIL | D3DSTENCILOP zrobić, jeśli test wzornika zakończy się pomyślnie, a test z zakończy się niepowodzeniem. |
D3DRS_STENCILPASS | D3DSTENCILOP, aby to zrobić, jeśli zarówno wzornik, jak i z-testy przeszły pomyślnie. |
D3DRS_STENCILFUNC | D3DCMPFUNC fn. Test wzornika przechodzi pomyślnie, jeśli ((ref & maska) stencilfn (wzornik & maska)) ma wartość true. |
Nowy zestaw stanów renderowania ma zastosowanie do trójkątów skierowanych do tyłu (w kierunku odwrotnym).
Stan renderowania | Opis |
---|---|
D3DRS_CCW_STENCILFAIL | D3DSTENCILOP zrobić, jeśli test wzornika zakończy się niepowodzeniem. |
D3DRS_CCW_STENCILZFAIL | D3DSTENCILOP zrobić, jeśli test wzornika zakończy się pomyślnie, a test z zakończy się niepowodzeniem. |
D3DRS_CCW_STENCILPASS | D3DSTENCILOP, aby to zrobić, jeśli zarówno wzornik, jak i z-testy przeszły pomyślnie. |
D3DRS_CCW_STENCILFUNC | funkcja D3DCMPFUNC. Test wzornika zakończy się pomyślnie, jeśli ((ref & maska) stencilfn (wzornik & maska)) ma wartość true. |
Pozostałe stany renderowania wzornika są zawsze stosowane zarówno do trójkątów wskazówek zegara, jak i odwrotnie do ruchu wskazówek zegara.
D3DRS_Two_Sided_StencilMODE jest ignorowana dla wierszy i sprites punktów, co oznacza, że zachowanie nie zmienia się z DirectX 8. Stany renderowania D3DRS_CCW_STENCIL* są ignorowane.
Nowy bit limitu wskazuje, czy urządzenie obsługuje tę funkcję. Oczekuje się, że sterowniki, które nie obsługują tej funkcji, ignorują te nowe stany renderowania. Wszystkie inne bity limitu wzornika mają zastosowanie do obu trybów buforowania wzornika. Ponieważ Two_Sided_Stencil oznacza możliwość rysowania z zestawem D3DCULLMODE_NONE, odpowiedni limit musi zostać ustawiony przez sterownik, jeśli obsługuje ten nowy tryb wzornika. Usługa Microsoft Windows Hardware Quality Labs (WHQL) powinna wymusić to.
Nowe stany renderowania:
D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC // Same default as D3DRS_STENCILFUNC
Nowy limit:
D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps
Tematy pokrewne