Udostępnij za pośrednictwem


Owijanie tekstur (Direct3D 9)

Krótko mówiąc, zawijanie tekstury zmienia podstawowy sposób, w jaki Direct3D rasteryzuje teksturowane wielokąty, używając współrzędnych tekstury określonych dla każdego wierzchołka. Podczas rasteryzacji wielokąta system interpoluje się między współrzędnymi tekstury na każdym wierzchołku wielokąta w celu określenia texelsów, które powinny być używane dla każdego piksela wielokąta. Zwykle system traktuje teksturę jako płaszczyznę 2D, interpolując nowe texels, biorąc najkrótszą trasę od punktu A w teksturze do punktu B. Jeśli punkt A reprezentuje pozycję u, v position (0.8, 0.1), a punkt B znajduje się na (0.1,0.1), linia interpolacji wygląda jak na poniższym diagramie.

diagram linii interpolacji między dwoma punktami

Należy pamiętać, że najkrótsza odległość między A i B na tej ilustracji przebiega mniej więcej przez środek tekstury. Włączenie zawijania współrzędnych tekstury u lub v-tekstury zmienia sposób, w jaki Direct3D postrzega najkrótszą trasę między współrzędnymi tekstury w kierunku u i w kierunku v. Z definicji zawijanie tekstur powoduje, że rasterizator przyjmuje najkrótszą trasę między zestawami współrzędnych tekstury, zakładając, że wartości 0.0 i 1.0 są przypadkowe. Ostatni bit to trudna część: Można sobie wyobrazić, że włączenie owijania tekstury w jednym kierunku powoduje, że system traktuje teksturę tak, jakby była owinięta wokół cylindra. Rozważmy na przykład poniższy diagram.

diagram tekstury i dwa punkty rozmieszczone wokół cylindra

Na powyższej ilustracji pokazano, jak zawijanie w kierunku u wpływa na to, jak system interpoluje współrzędne tekstury. Używając tych samych punktów co w przykładzie dla normalnych lub niezawiniętych tekstur, można zauważyć, że najkrótsza droga między punktami A i B nie przebiega już na środku tekstury; przebiega teraz przez granice, w której 0.0 i 1.0 istnieją razem. Zawijanie w kierunku v jest podobne, z wyjątkiem tego, że owija teksturę wokół cylindra leżącego na boku. Zawijanie zarówno w kierunku u, jak i w kierunku v jest bardziej złożone. W takiej sytuacji można wyobrazić sobie teksturę jako torus lub pączek.

Najczęstszym praktycznym zastosowaniem owijania tekstury jest mapowanie środowiska. Zazwyczaj obiekt teksturowany mapą środowiskową wydaje się bardzo odblaskowy, pokazując zwierciadlane odbicie otoczenia obiektu w scenie. Na potrzeby tej dyskusji obraz pokoju z czterema ścianami, każdy z nich malowany literą R, G, B, Y i odpowiednimi kolorami: czerwonym, zielonym, niebieskim i żółtym. Mapa środowiska dla takiego prostego pomieszczenia może wyglądać podobnie jak na poniższej ilustracji.

ilustracja pionowych pasków czerwonego, zielonego, niebieskiego i żółtego

Wyobraź sobie, że sufit pomieszczenia jest utrzymywany przez idealnie odbijający, czterostronny filar. Mapowanie tekstury mapy środowiska na filar jest proste; sprawianie, że filar wygląda tak, jakby odzwierciedlał litery i kolory nie jest tak proste. Na poniższym diagramie przedstawiono siatkę drucianą słupa z odpowiednimi współrzędnymi tekstury wymienionymi blisko górnych wierzchołków. Szew, w którym zawijanie przekroczy krawędzie tekstury, jest pokazane z kropkowaną linią.

diagram prostokąta z przecinającą kropkowaną linią

Po włączeniu zawijania w kierunku u, teksturowany filar pokazuje kolory i symbole z mapy środowiska odpowiednio i, w szwie przed teksturą, rasterizator prawidłowo wybiera najkrótszą trasę między współrzędnymi tekstury, zakładając, że współrzędne u 0.0 i 1.0 mają tę samą lokalizację. Teksturowany filar wygląda jak na poniższej ilustracji.

ilustracja filaru składającego się z czerwonych, zielonych, niebieskich i żółtych ćwiartek

Jeśli nie włączono zawijania tekstur, rasterizator nie interpoluje w kierunku wymaganym do wygenerowania wiarygodnego, odzwierciedlonego obrazu. Zamiast tego obszar z przodu filaru zawiera poziomo skompresowaną wersję texelsów między współrzędnymi u,175 i 0,875, gdy przechodzą przez środek tekstury. Efekt zawijania jest zepsuty.

Korzystanie z owijania teksturami

Aby włączyć zawijanie tekstur, wywołaj metodę IDirect3DDevice9::SetRenderState, jak pokazano w poniższym przykładzie kodu.

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

Pierwszy parametr akceptowany przez IDirect3DDevice9::SetRenderState jest stanem renderowania do ustawienia. Określ jedną z wyliczonych wartości od D3DRS_WRAP0 do D3DRS_WRAP7, aby ustawić zawijanie dla określonego poziomu tekstury. Określ flagi D3DWRAPCOORD_0 do D3DWRAPCOORD_3 w drugim parametrze, aby włączyć zawijanie tekstur w odpowiednim kierunku lub połącz je, aby włączyć zawijanie w różnych kierunkach. Jeśli pominiesz flagę, zawijanie tekstur w odpowiednim kierunku jest wyłączone. Aby wyłączyć zawijanie tekstur dla zestawu współrzędnych tekstury, ustaw wartość odpowiadającego mu stanu renderowania na 0.

Nie należy mylić owijania tekstur z podobnie nazwanymi trybami adresowania tekstury. Zawijanie tekstur jest wykonywane przed adresowaniem tekstur. Upewnij się, że dane opakowujące tekstury nie zawierają żadnych współrzędnych tekstur poza zakresem [0.0, 1.0], ponieważ spowoduje to wygenerowanie niezdefiniowanych wyników. Aby uzyskać więcej informacji na temat adresowania tekstur, zobacz Tryby adresowania tekstury (Direct3D 9).

Zawijanie mapy przemieszczania

Mapy przemieszczenia są interpolowane przez silnik teselacji. Ponieważ nie można ustawić tryby owijania dla silnika teselacji, nie można wykonać owijania tekstur przy użyciu map przemieszczeń. Aplikacja może używać zestawu wierzchołków, który wymusza zawijanie interpolacji w dowolnym kierunku. Aplikacja może również określić interpolację, która ma być wykonywana jako prosta interpolacja liniowa.

tekstury Direct3D